如何在steady_timer::async_wait中用lambda替换std::bind



在Coliru上直播

#include <iostream>
#include <boost/asio.hpp>
#include <functional>
class printer
{
public:
printer(boost::asio::io_context& io)
: timer_(io, boost::asio::chrono::seconds(1))
{
timer_.async_wait(std::bind(&printer::print, this));
// timer_.async_wait([this]() {
//     print();
// });
}
void print()
{ 
std::cout << "hello world" << std::endl;
}
private:
boost::asio::steady_timer timer_;
};
int main()
{
boost::asio::io_context io;
printer p(io);
io.run();
return 0;
}

我试图替换以下行:

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

带有

timer_.async_wait([this]() {
print();
});

但它失败了,编译器报告了以下错误:

main.cpp: In constructor 'printer::printer(boost::asio::io_context&)':
main.cpp:12:22: error: no matching function for call to 'boost::asio::basic_waitable_timer<std::chrono::_V2::steady_clock>::async_wait(printer::printer(boost::asio::io_context&)::<lambda()>)'
12 |     timer_.async_wait([this]() {
|     ~~~~~~~~~~~~~~~~~^~~~~~~~~~~
13 |         print();
|         ~~~~~~~~      
14 |     });
|     ~~  

问题>用lambda表达式重写std::bind的正确方法是什么?

谢谢

您的lambda没有所需的签名。

根据boost文档,回调采用const boost::system::error_code&参数。std::bind允许您在函数签名中稍微宽松一点(为什么std::bind可以分配给参数不匹配的std::function?(,但lambdas需要完全匹配。

以下代码似乎适用于我

timer_.async_wait([this](auto const &ec) {
print();
});

最新更新