Boost :: asio async_wait处理程序签名

时间:2009-11-22 15:15:12

标签: boost boost-asio

我正在浏览boost :: asio示例。我在看 Example 4

令人困惑的是,此示例中的WaitHandler具有签名

  

void print(this)

但async_wait调用需要一个

的处理程序
  

处理程序的函数签名必须是:

     

void handler(     const boost :: system :: error_code&错误//操作结果。   );

Source: Boost documentation

由于参数类型是函数签名的一部分,为什么在上面的例子中,async_wait接受一个参数不是boost :: system :: error_code?类型的处理程序

感谢。

2 个答案:

答案 0 :(得分:11)

正如您所正确观察的那样,async_wait方法接受一个处理函数,它接受一个参数(const boost :: system :: error_code&)。但是在Timer.4示例中,对async_wait的调用是通过boost bind传递的,如下所示:

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

boost :: bind返回一个函数对象,该对象引用 this 引用的对象 print 的方法 print 。 async_wait方法使用error参数调用此函数对象(因为这是它所期望的签名)。但是默认忽略error参数,因为它没有被bind引用。

官方boost::bind documentation提供了有关boost :: bind的更多详细信息。另见文章How the Boost Bind Library Can Improve Your C++ Programs(可能有更多文章可用,但我发现这篇文章非常有用)。

答案 1 :(得分:2)

您可以在调用async_wait时使用占位符指定回调函数所使用的参数。检查您链接到的页面上async_wait调用正上方的句子:

您将注意到此处未指定boost :: asio :: placeholders :: error占位符,因为打印成员函数不接受错误对象作为参数。

this example中搜索“占位符”,您将看到如何操作。