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

相關文章
相關標籤/搜索