织梦CMS - 轻松建站从此开始!

罗索

boost,asio的async方式bind

jackyhwei 发布于 2010-01-07 22:22 点击:次 
用了这么久boost.asio,感觉写得实在好。
TAG:

用了这么久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)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201001/8255.html]
本文出处:网络博客 作者:lixiaomail
顶一下
(0)
0%
踩一下
(1)
100%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容