对boost asio完成处理程序的rvalue引用
rvalue reference to boost asio completion handler
在boost::asio中,是否可以在C++11中使用移动语义和右值引用模拟来创建和实现完成处理程序?
我的尝试如下,但我不明白我得到错误的原因:
类别定义:
struct SocketTest : std::enable_shared_from_this<SocketTest> {
SocketTest(boost::asio::ip::udp::socket socket):socket_(std::move(socket)){}
template<typename Handler>
void async_receive(dummy dummy,Handler&& handler){
auto self(shared_from_this());
socket_.async_receive(boost::asio::buffer(buf_),
std::bind([this,self](
boost::system::error_code ec,
std::size_t bytes_transferred,
Handler&& moved_handler
){
moved_handler(ec,bytes_transferred);
}, std::move(handler)));
}
std::array<char,max_length> buf_;
boost::asio::ip::udp::socket socket_;
};
调用类的示例:
SocketTest socket_test(std::move(s));
socket_test.async_receive(dummy(), []( boost::system::error_code ec, std::size_t bytes_transferred){
// many cool things accomplished!
});
似乎下面复制处理程序的版本工作正常,但我有兴趣学习如何避免这种复制:
struct SocketTest : std::enable_shared_from_this<SocketTest> {
SocketTest(boost::asio::ip::udp::socket socket):socket_(std::move(socket)){}
template<typename Handler>
void async_receive(dummy dummy,Handler handler){
auto self(shared_from_this());
socket_.async_receive(boost::asio::buffer(buf_), [this,self,handler](boost::system::error_code ec, std::size_t bytes_transferred){
handler(ec,bytes_transferred);
});
}
std::array<char,max_length> buf_;
boost::asio::ip::udp::socket socket_;
};
完整的来源和错误可以在这里找到
不能将bind
引用到接受右值引用的可调用对象,因为当bind
保存其参数时,它就不再是右值了。在您的情况下,您可以通过值让它接受Handler
(这是存储处理程序的最后一个地方)。您可以查看此问题以了解更多详细信息。
此外,您忘记为bind
:提供占位符
socket_.async_receive(boost::asio::buffer(buf_),
std::bind([this,self](
boost::system::error_code ec,
std::size_t bytes_transferred,
Handler moved_handler
// ^^^^^^^ passing by value
){
moved_handler(ec,bytes_transferred);
}, std::placeholders::_1, std::placeholders::_2, std::move(handler)));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ placeholders added
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 对RValue对象调用的LValue ref限定成员函数
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 对boost asio完成处理程序的rvalue引用
- rvalue作为初始化程序来构造对象