3. 함수 객체
3-1. 함수 객체란
함수처럼 동작하는 객체로, ()연산자를 정의해야 한다.
struct Func
{
void operator()()
{
cout << "함수 객체" << end;
}
};
int main()
{
Func func;
func(10, 20); // func.operator()(10, 20)
}
함수 객체의 장점
- 함수처럼 동작하는 객체이기 때문에 다른 멤버 변수와 함수를 가질 수 있다.
- 함수 객체의 서명이 같더라도 타입이 다르면 서로 전혀 다른 타입으로 인식한다.
- 일반함수보다 빠르다
- 함수의 주소를 전달하여 콜백하는 경우에도 함수 객체는 인라인이 가능하다.
class Adder
{
int total;
public
Adder(int n=0) : total(n) {}
// 클래스 내부에 정의되므로 암묵적으로 인라인 함수가 된다.
int operator()(int n) // 서명이 같아도 다른 타입의 함수 객체는 댕비할 수 없다.
{
return total += n;
}
};
int main()
{
Adder adder;
cout << adder(10) << endl;
cout << adder(10) << endl;
cout << adder(10) << endl;
// 10
// 20
// 30
}
struct Func1
{
void operator()(int n)
{
cout << n << " ";
}
};
struct Func2
{
void operator()(int n)
{
cout << n*10 << " ";
}
};
struct Func3
{
void operator()(int n)
{
cout << "정수 : " << n << endl;
}
};
int main()
{
int arr[5] = {1,2,3,4,5};
// 기존에는 함수를 전달했지만, 이제는 함수 객체를 전달한다.
for_each(arr, arr+5, Func1()); // 임시 함수 객체 Func1()을 만들어 전달
for_each(arr, arr+5, Func2()); // 임시 함수 객체 Func2()을 만들어 전달
for_each(arr, arr+5, Func3()); // 임시 함수 객체 Func3()을 만들어 전달
}
※ 다만 사용자 정의 타입이기 때문에 미리 만들수는 없다. 그래서 템플릿을 사용한다.
3-2. 함수 객체의 구현
대표적인 함수 객체는 less와 greatter가 있다. 이 둘은 bool 형을 반환하는 조건자이다.
bool isLess(int a, int b)
{
return a < b;
}
struct Less
{
bool operator()(int a, int b)
{
return a < b;
}
};
int main()
{
Less ls;
cout << isLess(10, 20) << endl;
cout << ls(10, 20) << endl; // 객체로 암묵적 함수 호출
cout << ls.operator()(10, 20); // 명시적 호출
cout << Less()(10, 20) << endl; // 임시 객체로 암묵적 함수 호출
cout << Less().operator()(10, 20) // 명시적 호출
}
※ STL의 less 함수 객체
#include <functional> // less<> 헤더
typedef less<int> Less;
struct Less
{
bool operator()(int a, int b)
{
return a < b;
}
};
struct Greater
{
bool operator()(int a, int b)
{
return a > b;
}
};
int main()
{
// 사용자 구현 : Less, Greater
cout << Less()(10, 20) << endl;
cout << Greater()(10, 20) << endl;
// STL 사용 : less<int>, greater<int>
// 템플릿 클래스기이므로 임시 객체 less<int>(), greater<>()를 생성함.
cout << less<int>()(10, 20) << endl;
cout << greater<int>()(10, 20) << endl;
}
'C++ STL > Part 01 C++ 문법' 카테고리의 다른 글
4장 템플릿 (0) | 2021.06.22 |
---|---|
2장 함수 포인터 (0) | 2021.06.17 |
1장 연산자 오버로딩 (0) | 2021.06.17 |
댓글