包装模板化注册回调函数

问题描述 投票:0回答:0

我正在尝试包装来自 ros2 message_filters 同步器 的注册回调函数并遇到一些问题。 这个想法是有一个纯虚拟接口和 2 个派生类,两者都有一个名为 registerCallback 的函数;

  • 第一个简单地将回调传递给 message_filters::Synchronizer 中定义的 registerCallback 函数
  • 第二个将回调存储为成员变量,以便我们可以调用它进行测试
void register_callback(const std::function<void(ConstSharedMessageT, ConstSharedMessageT)>& callback) {
    // store the callback for future use
    callback_ = callback;//std::function<void(ConstSharedMessageT, ConstSharedMessageT)>(callback);

    // register the callback with the *real* synchronizer
    synchronizer_->registerCallback([&callback]( ConstSharedMessageT m1, ConstSharedMessageT m2) {
      callback(m1, m2);
    });
  }

以上是理想的函数签名,然而,我能够传递回调的唯一方法是使用

template<typename C>
void register_callback(const C& callback) 

这个问题是 Synchronizer::registerCallback 接受一个模板化变量,这是虚函数不允许的。将它传递给 std::bind 以外的任何东西似乎都会引起问题。

任何关于我可以实现此目标的替代方法的帮助或建议将不胜感激

c++ templates callback stdbind ros2
© www.soinside.com 2019 - 2024. All rights reserved.