用了这么久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