boost asio的async方式bind

用了这么久boost.asio,感受写得实在好。 async方式比较有意思。c++

acceptor_.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error));

这个地方能够bind一个函数,这个函数能够使用任意能够参数,在bind的参数里面增长。socket

这个比较有意思吧,像之前写程序,通常用回调函数的方法。async

函数能够传递的参数是有限的,这种方式,给咱们了很大的方便,使得咱们不用再使用void *转来转去。tcp

能够照自已的想法,写着方便,想传几个传几个。函数

呵呵,你们有没有想过,这是怎么实现的呢。 通过我对asio的代码的分析,写了一段,访照的代码,看我这个,比看asio的代码,简单多了。学习

template <typename Handler>
class handle_object
{
public:
    handle_object(Handler handler):Handler_(handler){}
    Handler Handler_;
    static void handle_objectCall(void *hobject)
    {
    handle_object<Handler> *p =(handle_object<Handler> *) hobject;
    p->Handler_();
    }
};
typedef void (*handle_objectCallT)(void *hobject);
class Test
{
public:
    Test()
    {
    m_Call =NULL;
    }
    template<class Handler>
    void Send(void *data,int len,Handler handler)
    {
	    handle_object<Handler> *pobjet = new handle_object<Handler>(handler);
	    m_Call= handle_object<Handler>::handle_objectCall;
	    handlerobj = pobjet;
    }
    void Call()
    {
    	m_Call(handlerobj);
    }
    void *handlerobj;
    handle_objectCallT m_Call;
};
void test(int i)
{
	printf("%d\n",i);
}
void test2(int i,int j)
{
	printf("%d,%d\n",i,j);
}
int _tmain(int argc, _TCHAR* argv[])
{
    Test t;
    t.Send(NULL,5,boost::bind(test,2));
    t.Call();
    t.Send(NULL,5,boost::bind(test2,2,3));
    t.Call();
  	return 0;
}

template<class Handler> Test::Send,Handler参数为bind进来的函数,和参数,经过实例化handle_object这个类,来保存,bind进来的函数,和参数。 handle_object有一个static函数handle_objectCall,咱们经过保存这个函数的指什,后面用来调用bind的函数。 为何经过这种方式能够达到这种效果呢,你们看看c++ template这本书。 实际上,handle_object不一样的模板类型,将生成不一样的static函数,因此在那里面,调用p->Handler_(); 也就能调用到相应的bind函数。this

写程序多动动脑筋吧,多看多想。 看了别人好的东西,要学习,不要以为过高深了用不上,而放弃了解一些真相。code

例子仍是够简单的吧,再NB的代码也是多思考后,写出来的。server

相关文章
相关标签/搜索