很多时候,我们需要提供一个类,这个类用来发出事件,通知程序中其他的组件进行处理,这可以通过回调来实现,下面是比较优雅的实现:
#include<boost/bind.hpp>
#include<boost/function.hpp>
using namespace boost;
class serialwraper
{
public:
typedef boost::function<void(int)> CallBack;
void RegisterCallBack(const CallBack& cb)
{
_cb=cb;
}
template<class C>
void RegisterCallBack2(void (C::*fn)(int),C& c)
{
_cb=boost::bind(fn,const_cast<C&>(c),_1);
}
void dataHandle(int x)
{
if(_cb)
_cb(x);
}
private:
CallBack _cb;
};
class serialHandler
{
public:
int y;
serialHandler():y(2)
{
}
public:
void printData(int x)
{
std::cout<<x<<":"<<y<<std::endl;
}
};
int main(int argc,char** argv)
{
serialHandler sh;
serialwraper sw;
//sw.RegisterCallBack(boost::bind(&serialHandler::printData,sh,_1));
sw.RegisterCallBack2(&serialHandler::printData,sh);
sw.dataHandle(10);
sh.y=3;
sw.dataHandle(20);
return 0;
}
上面的注册回调函数有两个写法
RegisterCallBack
核心的思路的boost::bind的使用,他可以将任何可调用对象(全局函数,成员函数,函数对象)重新构造成为一个函数对象,函数对象可以用boost::function来接收保存,供后续调用。RegisterCallBack2
上述代码
构造该可调用对象的时候,sh会值传递被拷贝到可调用对象内部,如果不想这样,可以使用ref(sh)。boost::bind(&serialHandler::printData,sh,_1)