-1

我想了解如何将 boost::aio::async_connect 与 lambda 一起使用。提升版本 1.68

我可以使用 std::bind 但不能使用 lambda,这真的很奇怪。如果我使用 std::bind,它可以工作。但是当我使用 lambda 时,它构建失败,并说“未满足 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)

    );
}

lambda 版本(不工作)

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);
                                                });
        }


    );
}

那么如何在这里使用 lambda 呢?

4

1 回答 1

3

您使用一对迭代器调用async_connect ,因此您的 lambda 应该满足迭代器连接处理程序要求。作为第二个参数,您必须传递连接的端点

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。您可以修改 bind 使其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。我不知道 lambda 和 bind 之间的这种分歧来自哪里。)

于 2019-05-28T17:02:18.500 回答