将boost绑定处理程序作为参数传递给asio绑定处理程序

时间:2015-10-16 14:22:27

标签: c++ boost lambda bind

嵌套的boost :: bind是否允许,如果是这样,我做错了什么?我可以成功地将lambda嵌套在bind中,但不能在bind中绑定。

第一个例子

简单案例

我可以管理标准使用boost :: bind来传递一个复杂的完成处理程序调用,其中只需要一个只需要错误代码的简单:

CWnd::ShowWindow

嵌套案例

但是如果我想封装一个boost asio操作的组合(例如多阶段async_connect和async_ssl_handshake)。

我的外部操作将是:

socket->receive(buffer, boost::bind(...));

并且我的第一个阶段定义将外部处理程序传递给另一个绑定中的第二个完成,以便最后可以调用外部处理程序:

connect_and_ssl(socket, boost::bind(...));

然而 handler boost :: bind 真的不喜欢成为另一个boost绑定的一部分。我得到了一个充满错误的整个屏幕,关于无法确定类型,以及其他错误。

Lambdas工作

但我发现我可以轻而易举地使用lambdas:

template<typename Socket, typename Handler>
void connect_and_ssl(Socket socket, Handler handler)
{
  socket.async_connect(endpoint, 
         boost::bind(&w::handle_connect, this, socket, handler, boost::asio::placeholders::error));
};

template<typename Socket, typename Handler>
void handle_connect(Socket socket, Handler handler, const boost::system::error_code& ec) {
  socket->async_handshake(handler);
}

为什么呢? Lambdas更容易编写和理解,但它们是否可能使嵌套绑定无法实现,或者我只是错误地表达了绑定?

第二个例子

简单案例

虽然这会编译:

template<typename Socket, typename Handler>
void connect_and_ssl(Socket socket, Handler handler)
{
  socket.async_connect(endpoint, 
         [=](const boost::system::error_code& ec) { handle_connect(socket, handler, ec); } );
};

嵌套案例

当转换为也从一个链中调用时:

m_ssl_socket->async_read_some(buffer, m_strand->wrap(handler));

它将不再编译 - 毫无疑问,由于strand-&gt;包装在boost :: bind

LAMBDA

然而,lamda版本编译并运行良好:

m_strand->post(boost::bind(&boost::asio::ssl::stream<boost::asio::ip::tcp::socket&>::async_read_some, m_ssl_socket, buffer, m_strand->wap(handler)));

我无法解决这个问题,但我很高兴lamdas。

1 个答案:

答案 0 :(得分:1)

嵌套bind需要protect

Boost Bind有它。

在C ++ 11中,您必须自己定义一个(例如使用reference_wrapper)。