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的代碼也是多思考後,寫出來的。