2009-11-22 85 views
6

我正在通過boost :: asio示例。我在看 Example 4Boost :: asio async_wait處理程序簽名

什麼是令人困惑的是,在WaitHandler在這個例子中有簽名

無效打印(本)

但async_wait調用需要的處理程序,其

處理程序的功能簽名必須是:

void handler( const boost :: system :: error_code &錯誤//操作結果。 );

Source: Boost documentation

由於參數類型的函數簽名的一部分,爲什麼在上面的例子中,async_wait接受處理,其參數不是一個類型爲boost ::系統:: ERROR_CODE?

THanks。

回答

11

正如您所看到的,async_wait方法接受一個處理函數,它接受一個參數(const boost :: system :: error_code &)。但在Timer.4例如,要async_wait呼叫被經由升壓綁定如下傳遞:

timer_.async_wait(boost::bind(&printer::print, this)); 

升壓::綁定返回一個函數對象,它指的是方法打印類打印機爲對象由引用。該函數對象由帶有error參數的async_wait方法調用(因爲這是它期望的簽名)。但是,錯誤參數默默無視,因爲它沒有被綁定引用。

官方boost::bind documentation提供了有關boost :: bind的更多細節。另見文章How the Boost Bind Library Can Improve Your C++ Programs(可能有更多的文章,但我發現這個非常有用)。

2

您可以使用佔位符在調用async_wait中指定回調函數使用哪些參數。檢查鏈接頁面上的async_wait調用上方的句子:

您將注意到boost :: asio :: placeholders :: error佔位符未在此指定,因爲打印成員函數不接受錯誤對象作爲參數。

this example中搜索「佔位符」,您將看到如何操作。

相關問題