如何正确绑定成员函数与 boost::bind
How to correctly bind a member function with boost::bind
我正在努力正确使用 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' 不能用作函数
管道.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::)(
LidarFovFilter.cpp[25, 73]:从这里需要
从我阅读的如何使用 boost::bind 和 boost::function 的内容来看,我认为我的代码应该可以工作(但显然它没有)。我在这里不知所措,为什么它没有。我的错误在哪里?帮助将得到真正的赞赏。
问题是你传递了一个指向 boost::function 的指针 - 你需要先取消引用:
void Callbackcaller(boost::function<void(const T &)> *Callback_fn) {
...
(*Callback_fn)(loc_tmp); //pipeline.hpp[96, 18]
};
相关文章:
- boost::bind()类似的东西,但用于函数调用
- 泛化传递给 boost::bind 的参数
- boost::bind函数缓冲区的最大大小
- 自 1.55 以来,boost::bind / boost::function 中的奇怪行为变化
- 使用 boost::bind 进行订阅回调时出错
- 如何使用 boost::bind 附加参数?
- boost::bind 无法绑定到纯虚拟基类中定义的非静态函数模板成员类型
- 如何正确绑定成员函数与 boost::bind
- 将 boost::function 和 boost::bind 替换为模板
- Boost Asio - boost::bind 导致程序崩溃
- 我可以使用 boost::bind 来存储不相关的对象吗?
- 在spirit parser Action中,在上下文参数上编译boost :: bind(成员函数)上的错误
- 如何使用 boost::bind 将返回 int 的函数转换为返回布尔值的函数
- boost::bind with member functions(作为boost::asio异步写入处理程序)
- 创建一个 boost::线程 带有 boost::bind() 或不带
- 如何使用 boost::bind 将静态成员函数绑定到 boost::function
- 为什么这"boost::bind"不编译?
- 访问Boost Bind时,共享库中的C 符号查找错误
- 使用 Boost.Bind 打印矢量元素
- 编译 Boost.Bind时出错