c++ - 如何使用 lambda 作为连接处理程序调用 boost async_connect 作为成员函数

标签 c++ boost asio

我成功地实现了 async_connect,使用它作为一个自由函数和一个 lambda 作为 connect_handler,如下所示:

auto self(shared_from_this());
boost::asio::async_connect(m_socket, endpoint_iter, [this, self](boost::system::error_code ec, tcp::resolver::iterator){...}

但是,现在我不得不使用 no_delay 标志。关于此条目 boost::asio with no_delay not possible?我必须调用 async_connect 作为套接字的成员函数。尝试如下

m_socket.async_connect(endpoint_iter->endpoint(), [this, self](boost::system::error_code ec, tcp::resolver::iterator){...}

我的编译器 (VS2013) 给我一个错误 Error 1 error C2338: ConnectHandler type requirements not met

有人知道如何正确地做吗?

最佳答案

自由函数的处理程序签名 async_connect应该是:

void handler(const boost::system::error_code& error, Iterator iterator);

成员函数的处理程序签名basic_stream_socket::async_connect应该是:

void handler(const boost::system::error_code& error);

原因是您将多个端点提供给自由函数,然后返回一个迭代器来告诉您哪个已连接,而您只将一个端点提供给成员函数而不必告诉您哪个是已连接,因为您只提供了一个。

因此,为了让您的代码正常工作,您很可能只需要从 lambda 回调的参数中删除迭代器:

m_socket.async_connect(endpoint_iter->endpoint(), [this, self](boost::system::error_code ec){...}

关于c++ - 如何使用 lambda 作为连接处理程序调用 boost async_connect 作为成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42132104/

相关文章:

C++ 数据分组类和常量访问

C++ 如何检查 cin 输入是 A-Z 模式

c++ - 使用 Hoare 分区方案的快速排序算法返回原始未排序列表

macos - 如何在 Homebrew 软件上构建带有 mpi 支持的 boost?

c++ - CMake:如何从预编译库中隐藏符号

c++ - 拥有 `ConstBufferSequence`的boost::asio数据

c++ - Qt - 重新实现 QIODevice 以实时听到我自己的声音

c++ - 为什么泛型编程设计更喜欢自由函数而不是成员函数?

c++ - asio 分配示例中的 ‘typename’ 是什么意思

c++ - asio::this_coro::executor 的实现是什么