c++ - 将 unique_ptr 引用传递给 boost::bind?

标签 c++ gcc boost boost-asio boost-bind

我在 CentOS 6.6 (gcc 4.4.7) 上使用 Boost.Asio (1.41) 进行开发。我希望 io_service 在启动时调用 manger 对象 m 中的成员函数 run()。我尝试编译的代码如下所示:

#include <memory>
#include <boost/asio.hpp>
#include <boost/bind.hpp>

boost::asio::io_service io;
std::unique_ptr<manager> m;
m = std::make_unique<manager>;
io.post(boost::bind(&manager::run, &m));

gcc 对 boost::bind 语句进行了调整,其中包括:

/usr/include/boost/bind/mem_fn_template.hpp:40: error: pointer to
member type ‘void (manager::)()’ incompatible with object type
‘std::unique_ptr<manager, std::default_delete<manager> >’

我想在这里做什么?

管理器对象只会知道定时器;一个了解 io_service 的单独对象稍后将添加到其构造函数中。但想法是 manager::run() 将创建一组初始计时器来引导系统。

澄清:

我的想法是,外部代码块管理 m 的生命周期,下一条语句将是 io.run()。当 io.run() 返回时,外部代码将销毁 m。因此,将 m 的原始引用传递给 io 是合适的。但我是一名现代 C++ 新手,可能离题很远。

最佳答案

你需要 C++-14 和 generalized lambda capture要完成这项工作——您需要将唯一指针移动到 lambda 中。相反,只需使用 shared_ptrstd::bind 本身就可以理解:

std::shared_ptr<manager> m;
m = std::make_shared<manager>();
io.post(std::bind(&manager::run, std::move(m)));

std::move 是可选的,但确保 m 不会在不需要时保留管理器。

关于c++ - 将 unique_ptr 引用传递给 boost::bind?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28820897/

相关文章:

c++ - cin 如何拆分整数序列?

c++ - Qt - 如何从线程创建 QFuture

c++ - 零大小数组不适用于模板

c - 为什么这个CPU运行速度更快?

Boost graph - 移除顶点后,顶点仍然存在

boost::filesystem exists() 在目录路径上失败,但 is_directory() 没问题

c++ - Qt 4 for symbian - 如果项目在 mac 中由 Qt4 Creator 构建,它可以通过 Window 部署到 symbian 吗?

C++ reinterpret_cast,制作唯一编号

c++ - 为什么 std::bind 在将 icc 14.01 与 gcc 4.8 一起使用时会出错?

c++ - 修改 Boost Multi-Index 项 : modify vs mutable 的非索引字段的最佳方法