用了這麼久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