gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:48:28 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com