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接口輕松實作類成員函數作為回調函數