嵌套的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:
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
内然而,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。
答案 0 :(得分:1)
嵌套bind
需要protect
。
Boost Bind有它。
在C ++ 11中,您必须自己定义一个(例如使用reference_wrapper
)。