将 unique_ptr 引用传递给 boost::bind?

Passing a unique_ptr reference to 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() 将为 bootstrap 系统创建一组初始计时器。

澄清:

我的想法是,外部代码块管理 m 的生命周期,下一条语句将是 io.run()。当io.run() returns时,外层代码会破坏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 不会在不需要时让管理器出现。