함수 객체

seio·2022년 9월 18일
0

C++ STL

목록 보기
3/17

함수 객체란?

함수 객체(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);
 }
profile
personal study area

0개의 댓글