我正在尝试使用 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/