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接口轻松实现类成员函数作为回调函数