【问题标题】:How to correctly bind a member function with boost::bind如何正确绑定成员函数与 boost::bind
【发布时间】:2019-09-14 14:31:10
【问题描述】:

我正在努力正确地使用 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 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 = LidarFovFilter*; T = 激光扫描]'

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

从我读到的如何使用 boost::bind 和 boost::function 我认为我的代码应该可以工作(但显然它不能工作)。我不知道为什么它不能工作。我的错误在哪里?真的会得到帮助。

【问题讨论】:

  • 只是出于好奇:您使用的是 c++11 之前的编译器吗?除非您受到这样的限制,否则使用最新的标准和 lambda 函数会有更好的解决方案。
  • 即使没有任何构建错误,它也不会起作用。原因是 &amp;BoundCallback 是一个指向 local 对象的指针,该对象将超出范围,并且在线程之前其生命周期结束。
  • @πάνταῥεῖ:谢谢你的提示,我会调查的 :)
  • @Someprogrammerdude: (*Callback_fn)(loc_tmp);处于一个while循环(以及更多)中,我省略了它,因为它不是问题的一部分,但感谢您的反对:)
  • 不是真正的“反对”,而是一个严重的问题。在使用Callback_fn_ 之前,您保存一个指向其生命周期结束的局部变量的指针。示例:if (some_condition) { int local_variable = 5; my_pointer = &amp;local_variable; } /* PROBLEM AHEAD! local_variable no longer exists and my_pointer is invalid */

标签: c++ templates boost callback


【解决方案1】:

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

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

【讨论】:

  • 非常感谢。那成功了。我太专注于 boost::bind 和 boost::function 以至于我错过了:)
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 2016-02-13
  • 2011-01-19
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
相关资源
最近更新 更多