是否允许嵌套的 boost::bind,如果可以,我做错了什么?我可以成功地将 lambda 嵌套在 bind 中,但不能在 bind 中嵌套。
第一个例子
简单案例
我可以管理标准使用 boost::bind 来传递一个复杂的完成处理程序调用,其中需要一个简单的只接受错误代码的调用:
socket->receive(buffer, boost::bind(...));
嵌套情况
但是如果我想封装 boost asio 操作的组合(例如多阶段 async_connect 和 async_ssl_handshake)。
我的外部操作是这样的:
connect_and_ssl(socket, boost::bind(...));
我的第一个阶段定义会将外部处理程序传递给另一个绑定(bind)中的第二个完成,以便可以在最后调用外部处理程序:
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);
}
但是 handler 是一个 boost::bind 真的不喜欢成为另一个 boost 绑定(bind)的一部分。我得到了一个充满错误的整个屏幕,关于无法确定类型等等。
Lambdas 工作
但我发现我可以轻松地改用 lambda:
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); } );
};
为什么? Lambda 更容易编写和理解,但是它们是否使嵌套绑定(bind)不可能实现的事情成为可能,或者我只是错误地表达了绑定(bind)?
第二个例子
简单案例
虽然这会编译:
m_ssl_socket->async_read_some(buffer, m_strand->wrap(handler));
嵌套情况
当转换为也从链中调用时:
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)));
它将不再编译——毫无疑问是因为 strand->wrap 在 boost::bind 中
lambda
但是 lamda 版本可以正常编译和运行:
m_strand->post([=](){m_ssl_socket->async_read_some(buffer, m_strand->wrap(handler)); } );
我无法解决,但我很高兴有 lamdas。
最佳答案
嵌套的 bind
需要 protect
。
Boost Bind 有。
在 C++11 中,您必须自己定义一个(例如使用 reference_wrapper
)。
关于c++ - 将 boost 绑定(bind)处理程序作为参数传递给 asio 绑定(bind)处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33172810/