함수 객체(Function Object)는 함수처럼 동작하는 객체입니다. 함수처럼 동작할려면 객체가 '()' 연산자를 정의해야 합니다. 다시 말해 '()' 연산자를 오버로딩한 객체이다.
함수 객체는 함수자(Functor)라 불리기도 한다
struct Functor{
void operator()()
{}
};
void print();
main{
Functor functor;
print(); // 전역 함수 호출
functor(); // 멤버 함수 호출
return 0;
}
functor는 객체지만 함수(functor())처럼 호출할 수 있다. '()'연산자 멤버 함수를 호출하며, 매개변수 리스트를 갖는 함수 객체를 만들 수 있다.
void operator()(int a, int b){};
함수 객체 장점
- '함수 객체'는 함수처럼 동작하는 객체이므로 다른 멤버 변수와 멤버 함수를 가질 수 있고, 일반 함수에서 하지 못하는 지원을 받을 수 있다.
- 함수 객체의 signature이 같더라도 객체 타입이 다르면 서로 전혀 다른 타입으로 인식한다.
- 속도도 일반 함수보다 함수 객체가 빠름
- 함수 주소를 전달하여 콜백하는 경우 함수 포인터는 인라인 될 수 없지만 함수 객체는 인라인 될 수 있고, 컴파일러가 쉽게 최적화 가능
(함수 포인터 인라인 불가능한 이유: 함수 포인터는 함수가 있어야 하므로 인라인 함수의 복사본 함수를 만들기 때문이다.)
STL에는 유용하게 사용할 수 있는 함수 객체가 내장돼 있다.
그중 대표적인 함수 객체는 less와 greater이다.
less는 < 연산자의 함수 객체이며, greater는 > 연산자의 함수 개체이다. 또한 less와 greater는 bool 형을 반환하는 조건자(predicate)이다.
bool pred_less(int a, int b){ return a<b;}
struct Less{
bool operator()(int a, int b){ return a<b;}
};
main(){
Less l;
l(1,2);
l.operator()(1,2);\
Less()(1,2);
Less().operator()(1,2);
}
STL의 less 함수 객체를 사용한 예제 코드
typedef less<int> Less;
main(){
Less l;
l(1,2);
l.operator()(1,2);\
Less()(1,2);
Less().operator()(1,2);
}