Я хочу узнать, как использовать boost::aio::async_connect с лямбдой. Буст версия 1.68
Очень странно, что я мог использовать std::bind, но не лямбду. Если я использую std::bind, он работает. Но когда я использую лямбду, он не работает и говорит: «Требования к типу IteratorConnectHandler не выполнены.
std::bind версия (работает)
void SslClient::connect(boost::asio::ip::tcp::resolver::results_type results) {
auto sp = shared_from_this();
boost::asio::async_connect(ws->next_layer().next_layer(),
results.begin(),
results.end(),
std::bind(
on_connect,
std::placeholders::_1)
);
}
лямбда-версия (не работала)
void SslClient::connect(boost::asio::ip::tcp::resolver::results_type results) {
auto sp = shared_from_this();
boost::asio::async_connect(ws->next_layer().next_layer(),
results.begin(),
results.end(),
[&, sp](boost::system::error_code ec) {
if (ec) {
return;
}
ws->next_layer().async_handshake(boost::asio::ssl::stream_base::client,
[&, sp](boost::system::error_code ec1) {
handShake(ec);
});
}
);
}
Итак, как использовать лямбду здесь?
Вы вызываете асинхронное_соединение с парой итераторов, поэтому ваша лямбда должна соответствовать Требования к обработчику подключения к итератору. В качестве второго параметра вы должны передать подключенная конечная точка.
boost::asio::async_connect(ws->next_layer().next_layer(),
results.begin(),
results.end(),
[&, sp]( boost::system::error_code ec,
boost::asio::ip::tcp::resolver::iterator it)
{
if (ec) {
return;
}
//...
Чтобы соответствовать ссылке, вы также должны исправить версию привязки. on_connect
также должен принимать iterator
в качестве второго параметра.
Ваша текущая версия bind
компилируется и работает, но когда асинхронная операция, инициированная async_connect
, завершается, функтор, созданный bind
, вызывается только с error_code
, вы не можете получить доступ к endpoint
. Вы можете изменить привязку так, чтобы она принимала on_connect
без каких-либо аргументов.
void on_connect(){}
boost::asio::async_connect(ws->next_layer().next_layer(),
results.begin(), results.end(), std::bind(on_connect)); // compiles fine
это также компилируется, но при вызове обработчика ни error_code
, ни endpoint
недоступны. (Да, немного странно, что вы не получаете ошибок компилятора при использовании bind
, которые сообщают, что требования обработчика не выполнены. Я не знаю, откуда взялось это несоответствие между лямбдой и привязкой.)
Пожалуйста, опубликуйте полное сообщение об ошибке.