이 페이지는 함수자를 공부해 보도록 하겠습니다.
이 페이지를 공부하기 위해서는 연산자 중복, 템플릿을 알고 있어야 합니다.
함수자(functor)는 함수처럼 동작하는 객체입니다.
함수자는 STL의 어뎁터나 술어(predicate), 바인더, 콜백 등에 사용됩니다.
1, 함수자 만들기
함수자를 사용하면 함수를 호출하는 것인지? 객체로 함수를 호출하는 것인지를 추상화할 수 있습니다.
함수자는 operator() 연산자 중복된 클래스의 객체입니다.
그럼 간단한 예제코드를 만들어 보도록 하겠습니다.
전역 함수 호출 예
using namespace std;
void Print( )
{
cout << "전역 함수!" << endl;
}
void main( )
{
Print( );
}
- 전역 함수!
간단하죠? ㅡㅡ;;
함수자를 이용한 호출 예
#include <iostream>using namespace std;
class Functor
{
public :
void operator( ) ( )
{
cout << "함수자!" << endl;
}
};
void main( )
{
Functor functor;
functor( ); //함수를 호출한 것인지, 객체의 멤버 함수 operator()를 호출한 것인지 알 수 없습니다.
functor.operator( ) ( ); // 실제 이렇게 멤버 함수를 호출합니다..
}
- 함수자!
- 함수자!
functor객체를 만들어 함수를 호출합니다.
인자를 갖는 함수를 보도록 하겠습니다.
전역 함수 호출 예
using namespace std;
void Print(int n)
{
cout << "정수 : " << n << endl;
}
void main( )
{
Print( 10 );
}
- 정수 : 10
간단!
함수자를 이용한 호출 예
using namespace std;
class Functor
{
public :
void operator( ) (int n)
{
cout << "정수 : " << n << endl;
}
};
void main( )
{
Functor functor;
functor( 10 ); // 암시적 호출
functor.operator( ) ( 10 ); //명시적 호출
}
- 정수 : 10
정수 : 10
간단하죠?!
2, 함수, 함수자, 함수 포인터
이 세 가지는 모두 동일한 인터페이스를 갖습니다.
함수와 함수자, 함수 포인터를 이용한 함수 호출 예제입니다.
using namespace std;
class Functor
{
public :
void operator( ) (int n)
{
cout << "정수 : " << n << endl;
}
};
void Print(int n)
{
cout << "정수 : " << n << endl;
}
void main( )
{
Functor functor;
void (*pfunc)(int ) = &Print;
Print( 10 ); //함수 호출 인터페이스가 모두 동일합니다.
functor( 10 );//함수 호출 인터페이스가 모두 동일합니다.
pfunc( 10 ); //함수 호출 인터페이스가 모두 동일합니다.
}
- 정수 : 10
정수 : 10
정수 : 10
이 예제처럼 호출 인터페이스만 보면 일반 함수, 함수자, 함수 포인터가 모두 동일한 방식으로 사용된다는 것을 알 수 있습니다.
이제 템플릿을 이용하면 함수의 리턴 자료형과 매개 변수 자료형에 상관없이 함수자를 이용할 수 있습니다.
using namespace std;
template <typename RType, typename AType>
class Functor
{
public :
RType operator( ) (AType n)
{
cout << "인자 : " << n << endl;
}
};
void main( )
{
Functor< void, int > functor;
functor( 10 );
}
- 인자 : 10
이처럼 좀 더 일반화할 수 있습니다.
'Basic Programming > C, C++' 카테고리의 다른 글
C++ - 함수 포인터와 함수자 - 4 (0) | 2016.04.18 |
---|---|
C++ - 함수 포인터와 함수자 - 3 (0) | 2016.04.18 |
C++ - 함수 포인터와 함수자 - 1 (0) | 2016.04.04 |
C++ - void 포인터, 함수 포인터 (1) | 2016.04.04 |
C++ - 비트맵(bmp) 저장 및 불러오기 (0) | 2016.03.29 |