Boostライブラリbindインタフェースはコールバック関数としてクラスメンバー関数を容易に実現

2418 ワード

C++では、非クラスメンバー関数またはクラスの静的メンバー関数をコールバック関数として実装するのは簡単ですが、クラスのメンバー関数をコールバック関数として使用するのは比較的複雑です.メンバー関数の呼び出しには特定のインスタンスオブジェクトが支持されなければならないためです.最近BOOSTライブラリを勉強していますが、BOOSTライブラリはコールバック関数としてクラスメンバー関数を実現するのが非常に簡単であることがわかりました.
BOOSTライブラリを簡単に紹介し、BOOSTライブラリはC++準標準ライブラリとも呼ばれ、ライブラリの大部分の特性はC++11に収録され、以下で使用するfunctionとbind機能はC++11に収録される.functionは関数オブジェクトの「コンテナ」タイプであり、bindはメンバー関数をバインドし、関数オブジェクトを返します.bindは、関数ポインタ、関数適用、メンバー関数ポインタ、関数オブジェクトをコールバックとしてバインドすることができ、非メンバー関数またはクラス静的メンバー関数をバインドする場合、関数パラメータは最大9個まで、メンバー関数をバインドする場合、関数パラメータは最大8個まで、インスタンスオブジェクトまたはthisポインタを指定するために使用されます.
次にbindを用いてクラス非静的メンバーをコールバック関数として実装する場合を示し,背景として他の方法で実装するのは複雑である.直接コード:
#include "stdafx.h"
#include <iostream>
#include "boost/bind.hpp"
#include "boost/function.hpp"
using namespace std;
using namespace boost;

//         
typedef function<int (int x,int y)>  CallBackFunction;       
//typedef int (*CallBackFunction)(int x, int y);             //     bind      

//    
class CMethod2
{
	typedef CMethod2 this_type;
public:
	CMethod2() {}
	~CMethod2() {}
public:
	int Add(int x,int y)                 // 1.              
	{
		return x + y;
	}
	static int AddS(int x,int y)         // 2.             
	{
		return x + y;
	}
};

int Add(int x,int y)                     // 3.            
{
	return x + y;
}

//     
void Test()
{
	int x = 10;
	int y = 10;
	CMethod2 mtd1;
	CMethod2 &mtd2 = mtd1;
	CMethod2 *mtd3 = &mtd1;
	// 1.  、    、        bind               
	CallBackFunction callBack1 = bind(&CMethod2::Add,&mtd1,_1,_2);
	CallBackFunction callBack2 = bind(&CMethod2::Add,&mtd2,_1,_2);
	CallBackFunction callBack3 = bind(&CMethod2::Add,mtd3,_1,_2);
	cout << "callBack1 Result:" << callBack1(x,y) << endl;
	cout << "callBack2 Result:" << callBack2(x,y) << endl;
	cout << "callBack3 Result:" << callBack3(x,y) << endl;
	// 2.          
	//CallBackFunction callBack4 = CMethod2::AddS;
	CallBackFunction callBack4 = bind(CMethod2::AddS,_1,_2);
	cout << "callBack4 Result:" << callBack4(x,y) << endl;
	// 3.         
	//CallBackFunction callBack5 = Add;
	CallBackFunction callBack5 = bind(Add,_1,_2);
	cout << "callBack5 Result:" << callBack5(x,y) << endl;
}

参考資料:1、Boostライブラリbindインタフェースは簡単にクラスメンバー関数をコールバック関数として実現する