我正在努力使用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”不能用作功能
pipeline.hpp [96,18]:实例化为“ void pipe_mpsc :: Callbackcaller(boost :: function )[with T = LaserScan]”:
pipeline.hpp [38,25]:来自'boolpipeline_mpsc :: subscribe(FUNC,OBJ)[带有FUNC = void(LidarFovFilter :: ) (const LaserScan&); OBJ = LidarFovFilter *; T = LaserScan]’
LidarFovFilter.cpp [25,73]:需要从此处
从我读到的如何使用boost :: bind和boost :: function的角度来看,我认为我的代码应该可以工作(但显然不能)。我的错误在哪里?帮助会真的很实用。
答案 0 :(得分:0)
问题是您传递了一个指向boost :: function的指针-您需要先解除引用:
void Callbackcaller(boost::function<void(const T &)> *Callback_fn) {
...
(*Callback_fn)(loc_tmp); //pipeline.hpp[96, 18]
};