用了这么久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) |