boost,asio的async方式bind

用了這麼久boost.asio,感覺寫得實在好。

async方式比較有意思。

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

這個地方可以bind一個函數,這個函數可以使用任意可以參數,在bind的參數裏面增加。

這個比較有意思吧,像以前寫程序,一般用回調函數的方法。函數可以傳遞的參數是有限的,這種方式,給我們了很大的方便,使得我們不用再使用void *轉來轉去。

可以照自已的想法,寫着方便,想傳幾個傳幾個。

呵呵,大家有沒有想過,這是怎麼實現的呢。

經過我對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函數。

寫程序多動動腦筋吧,多看多想。

看了別人好的東西,要學習,不要覺得太高深了用不上,而放棄瞭解一些真相。

例子還是夠簡單的吧,再NB的代碼也是多思考後,寫出來的。

 
lixiaomail
2008-07-18
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章