Boost庫bind接口函數實現類成員函數作爲回調函數

C++中,將非類成員函數或者類的靜態成員函數作爲回調函數實現起來非常簡單,但是將類的成員函數作爲回調函數使用實現起來就相對較複雜,因爲成員函數的調用必須有具體的實例對象支持。最近在學習BOOST庫,發現BOOST庫實現類成員函數作爲回調函數非常容易,故發文以作簡單總結。
簡要介紹了BOOST庫,BOOST庫又被稱爲C++準標準程序庫,庫中大部分特性都被收錄在C++11中,下面用到的function和bind功能就被收錄在C++11中。function是函數對象的“容器”類型,bind綁定成員函數,返回函數對象。bind可以綁定函數指針、函數應用、成員函數指針、函數對象作爲回調,在綁定非成員函數或者類靜態成員函數時,函數參數最多可以達到9個,在綁定成員函數時,函數參數最多可以達到8個,另外一個用於指明實例對象或者this指針。
下面指介紹利用bind實現類非靜態成員作爲回調函數情況,背景這種情況用其他方法實現起來較爲複雜。直接上代碼:
#include “stdafx.h”
#include
#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接口輕鬆實現類成員函數作爲回調函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章