c++ - 在编译时不知道父类的情况下传递带括号的函数指针

标签 c++ class pointers

我正在尝试使用 rti connext 作为通信服务在 gazebo 中设置模拟,以将一些参数传输到外部软件。

为此,我必须通过将函数指针传递给在新数据实例到达时调用的 subscriber_init 来初始化通信。

订阅者.h

void (*callback)(int i);
int subscriber_init(int domainId, char* topicName, callback cbPointer);

通过任何包含 subcriber.h 的 c 文件调用它是没有问题的。但是,如果我尝试在类里面进行交流,问题就会开始出现。

插件.cxx

#include subscriber.h
class Plugin{
  void load(){
    callback cbPointer = &Plugin::handler;
    subscriber_init(0,"Topic",cbPointer);
  }
  void handler(int i){ 
    //do someting
  }
}

这给了我

形式的错误
error: cannot convert ‘void (Plugin::*)(int)’ to ‘callback {aka void (*)(int)}’ in initialization callback cpPointer = &Plugin::handler

如何在不知道传递的函数指针的父类的情况下创建 typedef?

免责声明:不是编译示例,只是为了弄清楚我想做什么

最佳答案

只需将指向对象的指针传递给您的回调 函数或像这样使用void*:

typedef void (*callback)(int i, void* pParam);
int subscriber_init(int domainId, char* topicName, callback cbPointer, void* pParam)
{
    //...
    cbPointer(someInt, pParam);
    //...
}

并使用相应的 static Handler() 函数更新您的插件类。

class Plugin{
  void load(){
    callback cbPointer = &Plugin::handler;
    subscriber_init(0,"Topic", cbPointer, this);
  }

   void handler(int i){
     //do someting
   }

   static void handler(int i, void *pParam){
     Plugin *plg = static_cast<Plugin*>(pParam);
     plg->handler(i);
   }
};

关于c++ - 在编译时不知道父类的情况下传递带括号的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35771124/

相关文章:

c# - 你能在 C# 中编写一段 C++ 代码吗?

c++ - 函数数组 C++ 初始化错误?

c++ - 链接 C++ 流

C++:单例的替代品

java - 能够单独输入第一个对象的名称

c++ - 这个简单的 Message 类是否证明使用智能指针是合理的?

java - 使用 C++ (JNI) 包装 Java 库

Python:如何使用类方法子类化一个类

c - 返回字符指针并与字符串进行比较

c - 在非结构或 union 中请求成员 `type'