Использование лямбд с Boost Beast вместо привязки - PullRequest
1 голос
/ 05 апреля 2019

В в этом примере , если я изменю этот вызов с помощью bind:

boost::asio::async_connect(
        socket_,
        results.begin(),
        results.end(),
        std::bind(
            &session::on_connect,
            shared_from_this(),
            std::placeholders::_1));

На это:

    auto self = shared_from_this();
    boost::asio::async_connect(
                socket_,
                results.begin(),
                results.end(),
                [self](boost::system::error_code ec) {
        self->on_connect(ec);
    });

Я получу ошибку подтверждения:

boost/boost/asio/impl/connect.hpp:761: error: static_assert failed "IteratorConnectHandler type requirements not met"
  BOOST_ASIO_ITERATOR_CONNECT_HANDLER_CHECK(
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Там есть комментарий:

// If you get an error on the following line it means that your handler does
// not meet the documented type requirements for a IteratorConnectHandler.

Я лично не предпочитаю bind и хотел бы изменить его на lambda.Я делаю это неправильно или это небольшая ошибка в boost :: beast?

Кстати, переход на лямбду для on_resolve работает нормально.

1 Ответ

2 голосов
/ 05 апреля 2019

Количество параметров вашей лямбды не соответствует сигнатуре обработчика, согласно ссылке async_connect обработчики принимают error_code и подключенную конечную точку - в вашем случае она отсутствует.

Исправлено:

auto self = shared_from_this();
boost::asio::async_connect(
            socket_,
            results.begin(),
            results.end(),
            [self](boost::system::error_code ec, boost::asio::ip::tcp::resolver::iterator) {
                                                 ^^^
    self->on_connect(ec);
});
...