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

And*_*lus 6 c++ gcc boost boost-bind boost-asio

我使用 CentOS 6.6 (gcc 4.4.7) 并使用 Boost.Asio (1.41) 进行开发。我希望 io_servicerun()m启动时调用管理器对象中的成员函数。我试图编译的代码如下所示:

#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));
Run Code Online (Sandbox Code Playgroud)

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> >’
Run Code Online (Sandbox Code Playgroud)

我想在这里做什么?

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

澄清:

我的想法是,外部代码块管理 的生命周期,m下一条语句将是io.run(). 外部代码将mio.run()返回时销毁。因此,为mto传递原始引用io是合适的。但我是一个现代 C++ 新手,在这里可能会偏离基础。

Dav*_*rtz 5

您需要 C++-14 和通用 lambda 捕获来完成这项工作——您需要将唯一指针移动到 lambda 中。相反,只使用一个shared_ptr,它std::bind理解本身:

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

std::move是可选的,但确保在m不需要时不会让经理留在身边。