如何正确绑定成员函数与 boost::bind

How to correctly bind a member function with boost::bind

本文关键字:boost bind 函数 何正确 绑定 成员      更新时间:2023-10-16

我正在努力正确使用 boost::function 和 boost::bind 将传递的对象和成员函数绑定到 boost::function 中,该函数稍后在数据在队列中时调用

我正在研究一个用于线程间通信的多生产者单个消费者队列。基本思想是提供一个模板类。当数据发布到队列中时,订阅者通过回调函数获取数据,该函数必须在订阅时提供。

注意:...表示出于易读性原因省略代码的地方

T 是存储在队列中的类型

template <typename T>
class pipeline_mpsc
{...};

订阅功能

template <typename FUNC, class OBJ>
bool subscribe(FUNC fn, OBJ obj)
{
bool loc_return = false;
if (Callback_fn_ == NULL)
{
boost::function<void(const T &)> BoundCallback(boost::bind(fn, obj, _1));
Callback_fn_ = &BoundCallback;
boost::thread th(&pipeline_mpsc::Callbackcaller, this, &BoundCallback); //pipeline.hpp[38, 25]
loc_return = true;
}
return loc_return;
};
void Callbackcaller(boost::function<void(const T &)> *Callback_fn)  {
...
Callback_fn(loc_tmp); //pipeline.hpp[96, 18]
};

如何调用订阅函数

laserscan_sub_->subscribe(&LidarFovFilter::laserscan_callback, this); //LidarFovFilter.cpp[25, 73]

回调函数的原型

void LidarFovFilter::laserscan_callback(const LaserScan &scan)

当我编译它时,我从 gcc 收到以下错误:

'Callback_fn' 不能用作函数

管道.hpp[96, 18]:在实例化 'void pipeline_mpsc::Callbackcaller(boost::function

) [with T = LaserScan]':pipeline.hpp[38, 25]:必需自 'bool pipeline_mpsc::subscribe(FUNC, OBJ) [with FUNC = void (LidarFovFilter::)(

const LaserScan&);OBJ = 激光雷达滤波器*;T = LaserScan]'

LidarFovFilter.cpp[25, 73]:从这里需要

从我阅读的如何使用 boost::bind 和 boost::function 的内容来看,我认为我的代码应该可以工作(但显然它没有)。我在这里不知所措,为什么它没有。我的错误在哪里?帮助将得到真正的赞赏。

问题是你传递了一个指向 boost::function 的指针 - 你需要先取消引用:

void Callbackcaller(boost::function<void(const T &)> *Callback_fn)  {
...
(*Callback_fn)(loc_tmp); //pipeline.hpp[96, 18]
};