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

passing boost bind handlers as arguments to asio bind handlers

本文关键字:处理 绑定 程序 asio 参数传递 boost      更新时间:2023-10-16

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

<标题> 第一个例子

简单情况

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

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

嵌套的情况

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

我的外部操作将是这样的:

connect_and_ssl(socket, boost::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);
}

然而处理程序是一个boost::bind确实不喜欢成为另一个boost绑定的一部分。我得到了一个满是错误的屏幕,关于无法确定类型,和其他。

λ

但是我发现我可以很容易地使用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); } );
};

为什么?lambda更容易写,也更容易理解,但它们是否使嵌套绑定无法实现的事情成为可能,还是我只是错误地表达了绑定?

<标题>第二个例子h1>

简单例子

虽然这将编译:

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)));

将不再编译-毫无疑问,这是由于在boost::bind

内的strand->wrap

λ

但是lambda版本编译和运行良好:

m_strand->post([=](){m_ssl_socket->async_read_some(buffer, m_strand->wrap(handler)); } );

我不能解决这个问题,但我为lamdas感到高兴。

嵌套的bind需要protect

Boost Bind有。

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