Как правильно связать функцию-член с boost :: bind - PullRequest
1 голос
/ 25 апреля 2019

Я изо всех сил пытаюсь правильно использовать boost :: function и boost :: bind, чтобы связать переданный объект и функцию-член в boost :: function, которая вызывается позже, когда данные находятся в очереди

IЯ работаю над многопользовательской единой потребительской очередью для связи между потоками.Основная идея заключается в предоставлении шаблона класса.Когда данные публикуются в очереди, подписчик получает данные с помощью функции обратного вызова, которая должна быть предоставлена ​​при подписке.

Примечание: ... обозначает места, где я опускаю код для удобства чтения

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' не может быть использован как функция

pipe.hpp [96, 18]: в экземпляре void pipeline_mpsc :: Callbackcaller (boost:: function ) [with T = LaserScan] ': pipeline.hpp [38, 25]: требуется из' bool pipeline_mpsc :: subscribe (FUNC, OBJ) [с FUNC = void (LidarFovFilter :: *)1030 *) (const LaserScan &);OBJ = LidarFovFilter *;T = LaserScan] '
LidarFovFilter.cpp [25, 73]: требуется здесь

Из того, что я прочитал, как использовать boost :: bind и boost :: function, я думаю, что это мой коддолжен работать (но, очевидно, это не так). Я в недоумении, почему это не так.Где моя ошибка?Помощь будет действительно ценной.

1 Ответ

0 голосов
/ 25 апреля 2019

Проблема в том, что вы передаете указатель на boost :: function - вам нужно сначала разыменовать:

void Callbackcaller(boost::function<void(const T &)> *Callback_fn)  {
   ...
   (*Callback_fn)(loc_tmp); //pipeline.hpp[96, 18]
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...