简体   繁体   中英

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

I am struggling to use boost::function and boost::bind correctly to bind the passed object and member function into a boost::function which than is later called when data are in the queue

I am working on a multi producer single consumer queue for inter-thread communication. The basic idea is to provide a template class. When data published into the queue, the subscriber gets the data via a callback function which has to supply on subscription.

Note: ... denotes places where I omit code for legibility reasons

T is the type which is stored in the queue

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

The subscribe function

  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]
};

How I call the subscribe function

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

Prototype of the Callback function

void LidarFovFilter::laserscan_callback(const LaserScan &scan)

When I compile it I get following error from gcc:

'Callback_fn' cannot be used as a function

pipeline.hpp[96, 18]:In instantiation of 'void pipeline_mpsc::Callbackcaller(boost::function ) [with T = LaserScan]':

pipeline.hpp[38, 25]:required from 'bool pipeline_mpsc::subscribe(FUNC, OBJ) [with FUNC = void (LidarFovFilter:: )(const LaserScan&); OBJ = LidarFovFilter*; T = LaserScan]'

LidarFovFilter.cpp[25, 73]: required from here

From what I read how to use boost::bind and boost::function I think it my code should work (but obviously it doesn't).I am at loss here why it doesn't. Where is my mistake? Help would be really appricated.

Issue is you pass a pointer to a boost::function - you need to dereference first:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM