我可以使用boost :: bind来存储不相关的对象吗?

时间:2017-01-30 11:29:46

标签: c++ visual-c++ boost boost-asio boost-bind

我可以使用boost :: bind来使得到的函数对象存储一个未被声明为绑定目标函数的参数的对象吗?例如:

void Connect(const error_code& errorCode)
{
    ...
}

// Invokes Connect after 5 seconds.
void DelayedConnect()
{
    boost::shared_ptr<boost::asio::deadline_timer> timer =
        boost::make_shared<boost::asio::deadline_timer>(ioServiceFromSomewhere);

    timer->expires_from_now(
        boost::posix_time::seconds(5));

    // Here I would like to pass the smart pointer 'timer' to the 'bind function object'
    // so that the deadline_timer is kept alive, even if it is not an actual argument
    // to 'Connect'. Is this possible with the bind syntax or similar?
    timer->async_wait(
        boost::bind(&Connect, boost::asio::placeholders::error));
}

PS。我最感兴趣的是已经存在的这样做的语法。我知道我可以自己制作自定义代码。我也知道我可以手动保持计时器,但我想避免这种情况。

2 个答案:

答案 0 :(得分:2)

是的,你可以通过绑定额外的参数来做到这一点。我经常用asio做到这一点,例如为了在异步操作期间保持缓冲区或其他状态存活。

您也可以通过扩展处理程序签名来使用它们从处理程序中访问这些额外的参数:

void Connect(const error_code& errorCode, boost::shared_ptr<asio::deadline_timer> timer)
{
}

timer.async_wait(
    boost::bind(&Connect, boost::asio::placeholders::error, timer));

答案 1 :(得分:1)

是的,你可以简单地绑定太多&#34;参数,他们不会被传递给底层的处理程序。见Why do objects returned from bind ignore extra arguments?

这是好的,除非你需要&#34;与&#34;来自Connect的计时器对象。

PS。此外,当计时器被销毁时,不要忘记使用operation_abandoned完成计时器。