본문 바로가기

C..C++....

std::tr1::bind / function 사용방법

#include  <functional>
#include  <iostream>
 
using namespace std;
using namespace std::tr1::placeholders; // tr1::bind에서 _1을 쓰기위한 namespace 
class Test
{
public:
	typedef int result_type;	// operator()을 위해서 꼭 써줘야 된다!
public:                                      
	int operator() (int k) const
	{
		cout << "Result : "<< k <<endl;
		return 1;
	}
	int Message(int k)
	{
		cout << "Result : " << k <<endl;
		return 1;
	}
};
 
int MessageTest(int k)
{
	cout << "Result : " << k << endl;
	return 1;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
	std::tr1::function<int(int)> fun;
	//반환값 int형 매개변수 int을 받아들이는 함수 포인터를 생성.
 
	Test t;	
	fun = std::tr1::bind(t,_1);
	// fun에 바인드시킨다 operator()부분 실행. _1은 매개변수
	fun(10);
	//Result = 10;
 
	fun = std::tr1::bind(t,3);
	// _1이 아닌 3을 넣으면 아래부분 10을 무시하고 3으로만 뿌려준다
	fun(10);
	//Result = 3;
 
	fun = std::tr1::bind(&Test::Message,t,_1);
	//Operator()이 아닌 맴버 함수 실행해줄때..	
	fun(10);
	//Result = 10; 

	fun = std::tr1::bind(&MessageTest,_1);
	// 비 맴버 함수
	fun(10);
        //Result = 10; 
	return 0;
}
추가내용.. 
typedef int result_type;는 bind 시킬함수의 반환값을 정의하는 부분입니다.
위의 내용에서는 반환값이 int형이기 때문에 reault_type을 int로 정의했고
리턴값이 void형일때도 typedef void result_type 이런식으로 써주셔야 됨니다..