6

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

令人困惑的是,这个例子中的 WaitHandler 有签名

无效打印(本)

但是 async_wait 调用需要一个处理程序,其

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

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

资料来源:Boost 文档

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

谢谢。

4

2 回答 2

12

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

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

boost::bind 返回一个函数对象,该对象引用了this引用的对象的类打印机的方法print。此函数对象由带有错误参数的 async_wait 方法调用(因为这是它所期望的签名)。但是错误参数被静默忽略,因为绑定没有引用它。

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

于 2009-12-21T22:47:58.227 回答
2

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

您会注意到这里没有指定 boost::asio::placeholders::error 占位符,因为 print 成员函数不接受错误对象作为参数。

在此示例中搜索“占位符” ,您将了解如何操作。

于 2009-11-22T15:19:12.413 回答