如何使用lamba作为连接处理程序将boost async_connect作为成员函数调用

时间:2017-02-09 08:56:46

标签: 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

有人有想法,如何正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

自由函数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){...}