我正在浏览boost :: asio示例。我在看 Example 4
令人困惑的是,此示例中的WaitHandler具有签名
void print(this)
但async_wait调用需要一个
的处理程序处理程序的函数签名必须是:
void handler( const boost :: system :: error_code&错误//操作结果。 );
由于参数类型是函数签名的一部分,为什么在上面的例子中,async_wait接受一个参数不是boost :: system :: error_code? p>类型的处理程序
感谢。
答案 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中搜索“占位符”,您将看到如何操作。