如何使用boost :: bind

时间:2019-04-25 08:02:21

标签: c++ templates boost callback

我正在努力使用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的角度来看,我认为我的代码应该可以工作(但显然不能)。我的错误在哪里?帮助会真的很实用。

1 个答案:

答案 0 :(得分:0)

问题是您传递了一个指向boost :: function的指针-您需要先解除引用:

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