【问题标题】:Boost::asio async_wait handler signatureBoost::asio async_wait 处理程序签名
【发布时间】:2010-12-19 05:40:57
【问题描述】:

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

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

无效打印(这个)

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

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

无效处理程序( const boost::system::error_code& error // 操作结果。 );

Source: Boost documentation

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

谢谢。

【问题讨论】:

    标签: boost boost-asio


    【解决方案1】:

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

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

    boost::bind 为 this 引用的对象返回一个函数对象,该对象引用类 printer 的方法 print。此函数对象由带有错误参数的 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 占位符是 此处未指定,因为 print 成员函数不接受 错误对象作为参数。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多