使用带有Boost Beast的lambda代替绑定

时间:2019-04-05 17:35:45

标签: c++ c++11 boost lambda boost-beast

this example中,如果我使用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.

我个人don't prefer bind,并希望将其更改为lambda。我做错了吗?或者这是boost :: beast中的小错误?

通过将on_resolve更改为lambda可以正常工作。

1 个答案:

答案 0 :(得分:2)

lambda的参数数量与处理程序签名不匹配,根据参考文献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);
});