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

时间:2015-03-02 22:48:09

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

我使用CentOS 6.6(gcc 4.4.7)并使用Boost.Asio(1.41)进行开发。我希望io_service在manger对象run()启动时调用成员函数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));

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()。当m返回时,外部代码将销毁io.run()。因此,将m的原始引用传递给io是合适的。但我是一个现代的C ++新手,可能会离开这里。

1 个答案:

答案 0 :(得分:3)

你需要C ++ - 14和generalized lambda capture来完成这项工作 - 你需要将唯一指针移动到lambda中。相反,只需使用shared_ptr std::bind本地理解:

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

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