2014-01-14 105 views
0

我嘗試綁定boost :: asio參數。綁定功能是結構的靜態成員:boost :: bind static function的參數

template <typename T> 
struct bind_struct{ 

    typedef boost::system::error_code       error_code; 
    typedef boost::asio::ip::tcp::acceptor     tcp_acceptor_type; 
    typedef std::shared_ptr<boost::asio::ip::tcp::socket>  socket_type; 


    static void tcp_on_async_accept(error_code& er, 
            tcp_acceptor_type* acc, 
            socket_type socket){ 
     std::cout << "ok" << std::endl; 
    } 
    static void good_function(int m){ 
     std::cout << m << std::endl; 
    } 


}; 

綁定操作:

/*Error*/ 
    bind_struct<void>::socket_type sock; 
    bind_struct<void>::tcp_acceptor_type* acc; 
    auto fn = boost::bind(bind_struct<void>::tcp_on_async_accept, 
               boost::asio::placeholders::error, 
               acc, sock); 
    fn(); 


    /*Ok*/ 
    auto fn1 = boost::bind(bind_struct<void>::good_function,_1); 
    fn1(10); 

什麼是一個問題嗎? Errors.

+0

'bind()'可能會讓你困惑,因爲你試圖綁定一個沒有對象的成員函數(理論上可以,因爲成員是靜態的)。如果你將'&sock'作爲第二個參數傳遞給'bind()',是否會改變錯誤? – Chad

+0

@Chad smart_poiter通過鏈接它是正常的? http://coliru.stacked-crooked.com/a/7615c6464bd2d488 – crastinus

回答

2

fn()失敗,因爲仿函數期望傳遞給它的第一個參數能夠綁定到boost::system::error_code&

的Boost.Asio的文檔boost::asio::placeholders::error狀態:

參數的佔位符,用於與boost::bind()使用中,對應於一處理程序的任何的異步函數的誤差參數。

因此,當功能:

void bind_struct::tcp_on_async_accept(
    boost::system::error_code&, 
    boost::asio::ip::tcp::acceptor*, 
    std::shared_ptr<boost::asio::ip::tcp::socket>) 

與約束:

boost::asio::ip::tcp::acceptor* acceptor; 
std::shared_ptr<boost::asio::ip::tcp::socket> socket; 
auto fn = boost::bind(
    bind_struct<void>::tcp_on_async_accept, 
    boost::asio::placeholders::error, // _1 
    acceptor, socket); 

所得仿函數fn只能被調用時傳遞到它的調用的第一個參數可以結合boost::system::error_code& 。因此,下面將失敗:

fn(); 

,其中爲下面的工作:

boost::system::error_code error; 
fn(error); 

考慮閱讀this博客爲bind()一個偉大的圖示的例子。


如果bind_struct::tcp_on_async_accept()將被用作處理程序的async_accept()操作,然後再考慮改變第一參數類型通過值或const引用接受error_codeAsynchronous Operations類型要求指定處理程序的第一個參數是boost::system::error_code類型的左值,AcceptHandler文檔指出h是否爲處理程序,而ec是常量error_code,則表達式h(ec)必須有效。由於const error_code不能綁定到boost::system::error_code&,因此bind_struct::tcp_on_async_accept()未能滿足AcceptHandler類型的要求。

+0

我會發現一個錯誤。函數必須接受const const boost :: asio :: error_code&。但它有用的信息。 – crastinus

+1

@crastinus每個[AcceptHandler](http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/AcceptHandler.html)文檔,如果'h'是一個處理程序,'ec'是const'error_code',那麼表達式'h(ec)'必須是有效的。因此,函數可以通過值或const引用接受'error_code'。當使用'bind()'時,在構造函子時可以將添加參數綁定到函數。雖然'placeholders :: error'('_1')可能在零次或多次綁定中出現,不同位置的佔位符(例如'_2')可能不會出現在綁定中。 –