Boost::asio异步等待处理程序签名

6
我正在学习boost::asio的例子,我正在查看Example 4
令人困惑的是,这个例子中的WaitHandler的签名为:

void print (this)

但是async_wait调用期望一个处理程序,其

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

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

来源:Boost文档 由于参数类型是函数签名的一部分,为什么上面的例子中,async_wait接受的处理程序的参数不是boost::system::error_code类型?
谢谢。
2个回答

12

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

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

boost::bind返回一个函数对象,该函数对象引用类printer的方法print,该方法是由this引用的对象调用的。 async_wait方法使用错误参数调用此函数对象(因为这是它所期望的签名)。 但是,错误参数被静默忽略,因为它没有被绑定引用。 boost::bind文档提供有关boost::bind的更多详细信息。另请参阅文章如何使用Boost Bind库改进您的C ++程序(可能有许多其他文章可用,但我发现这篇文章非常有用)。

2
您在调用async_wait时需要使用占位符指定回调函数的参数。请查看您链接页面上async_wait调用上方的句子:
“您会注意到这里没有指定boost::asio::placeholders::error占位符,因为print成员函数不接受错误对象作为参数。”
此示例中搜索“placeholder”,您将看到如何执行此操作。请注意保留HTML标记。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接