#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; }Traté de reemplazar la siguiente línea:
timer_.async_wait(std::bind(&printer::print, this));con
timer_.async_wait([this]() { print(); });Pero falló y el compilador informa los siguientes errores:
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 | }); | ~~Pregunta > ¿Cuál es la forma correcta de reescribir la expresión std::bind con lambda?
Gracias
Su lambda no tiene la firma requerida.
Basado en la documentación de boost , la devolución de llamada toma un argumento const boost::system::error_code& . std::bind le permite ser un poco más flexible en la firma de la función ( ¿Por qué std::bind se puede asignar a std::function con argumentos no coincidentes? ), Pero las lambdas deben ser una coincidencia exacta.
El siguiente código parece funcionar para mí.
timer_.async_wait([this](auto const &ec) { print(); });