将boost绑定处理程序作为参数传递给asio绑定处理程序
passing boost bind handlers as arguments to asio bind handlers
是否允许嵌套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
)
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在 Mac 上C++编译代码时处理“dyld:惰性符号绑定失败:找不到符号”错误
- 解除 lambda 事件处理程序的绑定
- 独立 asio async_connect不触发绑定处理程序
- 当不处理指针时,请调用子类(虚拟)函数(较晚绑定)
- boost.python向现有的PyObject添加绑定(对于例外处理)
- Sample.exe中0x7537812f处未处理的异常:0xC0020001:字符串绑定无效
- 创建具有提升绑定/函数的菜单处理程序
- 提升 asio 绑定读取处理程序
- 将异步操作的处理程序绑定到另一个类的非静态成员
- 将boost绑定处理程序作为参数传递给asio绑定处理程序
- 完成处理程序中的Boost绑定错误
- OpenGL和C++:实时处理和绑定缓冲区