【发布时间】:2019-02-23 09:11:38
【问题描述】:
当我使用boost::asio::steady_timer 时,我发现lambda、bind、function pointer 之间有些不同。
#include <iostream>
#include <boost/asio.hpp>
void print() { std::cout << "Hello, world!" << std::endl; }
int main()
{
boost::asio::io_context io;
boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
t.async_wait(&print); // Error
t.async_wait([]{print();}) // Error
t.async_wait(std::bind(print)); // Done
io.run();
return 0;
}
我阅读了 asio 手册,async_wait 处理程序需要 const boost::system::error_code& error 参数。因此,如果我将print 更改为void print(const boost::system::error_code & /*e*/),则一切正常。但是timer4/timer.cc && timeouts/server.cc 的 asio 示例使用了通过绑定创建的处理程序,而没有 void print(const boost::system::error_code & /*e*/)。当我更改为 lambda 时,编译错误。那么,bind && lambda 之间的签名有何不同。
#include <iostream>
#include <functional>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
class printer
{
public:
printer(boost::asio::io_context &io)
: timer_(io, boost::asio::chrono::seconds(1)), count_(0)
{
timer_.async_wait(std::bind(&printer::print, this));
}
~printer() { std::cout << "Final count is " << count_ << std::endl; }
void print()
{
if (count_ < 5) {
std::cout << count_ << std::endl;
++count_;
timer_.expires_at(timer_.expiry() +
boost::asio::chrono::seconds(1));
timer_.async_wait(boost::bind(&printer::print, this));
// timer_.async_wait([this]{print();}); Error
}
}
private:
boost::asio::steady_timer timer_;
int count_;
};
int main()
{
boost::asio::io_context io;
printer p(io);
io.run();
return 0;
}
【问题讨论】:
-
我已经找到答案了,bind会忽略过多的参数。比如
void print() { cout << 1 << endl; } int main() { auto f = bind(print); f(2); }是对的。
标签: c++ c++11 boost c++14 asio