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

你可能感兴趣的:(C++,c,socket,C#,J#)