2017-07-10 94 views
0

我想寫一個調用boost :: asio操作的庫模塊。根據結果​​,該模塊將被應用程序邏輯層用於進一步處理。boost :: bind如何定義一個函數,將回調作爲參數

我的要求很簡單明瞭。我需要的是能夠在下面的Util類中指定一個回調函數fn,它可以使用任何函數ptr或boost :: bind(member fn)或其他函數,並在異步代碼完成後調用該回調函數。

class Util { 
    public: 
    void sendMsg(const Msg& m, <some callback fn here...>) { 
     // Make a call to boost::asio approximately as below.. 
     boost::asio::async_write(socket_, boost::asio::buffer(message_), 
        boost::bind(&tcp_connection::handle_write, shared_from_this(), 
        boost::asio::placeholders::error, 
        boost::asio::placeholders::bytes_transferred)); 

     // Here, I want to pass the "<some callback fn here>" to async_write, 
     // instead of calling boost::bind here. How to do that? 
    } 
}; 

所以,我的具體問題是.. 應該我SENDMSG簽名是什麼樣子?我無法到達fn簽名,特別是回調部分。

感謝任何讓我知道如何做到這一點。

+0

'的std :: function'?或模板類型? – Arcinde

+0

好的。這些天我已經失去了很多C++的聯繫。你可以提供一個簡單的例子..請 –

+1

好吧,thx的提示。我似乎已經明白了。我有點老派的C++。熟悉提升,異步的東西。 –

回答

0

如果你有機會到lambda表達式,很容易

class Util { 
    public: 
    template <typename _Proc> 
    void sendMsg(const Msg& m, _Proc proc) 
    { 
     shared_ptr<Util> pThis = shared_from_this; 
     boost::asio::async_write(socket_, boost::asio::buffer(message_), 
      [&proc, =pThis/* , etra args */](boost::...::error_code ec, size_t bytes) // <- use capture to pass extra agruments and shared ptr 
      { 
       // use pThis ! 
       proc(/* etra args */); 
       // or pthis->proc() 
      }); 
     } 

}; 

這將接受lambda表達式以及性病/升壓::功能

+0

謝謝。但是Y用於Util類的shared_ptr? Util :: sendMsg的調用者應該提供一個回調函數fn,我將其傳遞給async_write。沒有? –

+0

通過調用bind()或lambda捕獲,shared_ptr通過值傳遞給調用對象。只有當有I/O操作或定時器掛起時,才能使對象保持活動狀態。當與客戶的對話結束時,這個''會自動銷燬,除非你把它保存在別的地方。通常,消息智能指針被傳遞。 –

相關問題