将 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_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
不会在不需要时让管理器出现。
我正在使用 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_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
不会在不需要时让管理器出现。