c++ - 将 boost 绑定(bind)处理程序作为参数传递给 asio 绑定(bind)处理程序

标签 c++ boost lambda bind

是否允许嵌套的 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/

相关文章:

c++ - 如何使用 NTL 库 (C++) 对数字进行下限

c# - 从 C# 调用 C++ DLL

c++ - 应该替换现有类型,添加新类型

c++ - 如何在 C++ 中将十六进制值的字符数组转换为单个整数值?

c++ - 使用 boost::gil 编写 jpeg 文件

用于自定义监听器的 Android 数据绑定(bind)库 lambda

C++ Boost 信号和槽连接

python - 编译 DLIB 时出错 - 找不到 Boost

java - 仅使用 JDK8+ Lambda 连接相同对象类型的列表

c# - 是否可以将 Func<T1,T2,TResult> 转换为 Func<T2,T1,TResult>