创建指向header内部所有公共静态成员函数的指针数组,然后使用它

C++ Create pointer array to all public static member functions inside header and then use it

本文关键字:数组 指针 然后 函数 静态成员 header 内部 创建      更新时间:2023-10-16

[Ubuntu 13.10]

我正在创建一个包含一堆回调函数的类。在我的主程序中,我将这些回调函数分配给各个节点。我希望能够在循环中做到这一点,所以我试图在头类(没有.cpp)中创建一个静态指针数组,该数组具有其成员函数的所有地址。

我似乎搞不懂做这件事的语法。

1)下面是我的头定义类。我初始化cbPointer的正确方式?

#include "std_msgs/String.h"
typedef void (*FunctionPointer)(const std_msgs::String_<std::allocator<void> >::ConstPtr &);
class myCallbacks {
public:

    static void cbEvent1(const std_msgs::String::ConstPtr& msg) {
            std::cout << "I heard: " << msg->data.c_str() << std::endl;
    }
    static void cbEvent2(const std_msgs::String::ConstPtr& msg) {
            std::cout << "I heard: " << msg->data.c_str() << std::endl;
    }
    constexpr static const FunctionPointer cbPointer[2] = {&myCallbacks::cbEvent1, &myCallbacks::cbEvent2};
};

然后在主程序中,我像这样分配回调函数:

for (int j=0; j<NO_CALLBACKS; j++) {
    subList[j] = (sNode[j])->subscribe(myCallbacks::cbPointer[j]);
}

subscribe方法的签名如下:

template<class M , class T >
subscribe (void(T::*fp)(M))

但我得到一个链接错误:undefined reference to myCallbacks::cbPointer。我已经尝试了各种各样的subList[j] = (sNode[j])->subscribe(myCallbacks::cbPointer[j]);变化,但似乎没有工作。

有人能帮我用正确的语法吗?(另外,是否可以在头文件中创建数组而不拼写每个函数名?)

我已经知道怎么做了:

#ifndef MYCALLBACKS_H
#define MYCALLBACKS_H
#include "std_msgs/String.h"
typedef void (*FunctionPointer)(const std_msgs::String_<std::allocator<void> >::ConstPtr &);
class myCallbacks {
public:

    static void cbEvent1(const std_msgs::String::ConstPtr& msg) {
            std::cout << "I heard: " << msg->data.c_str() << std::endl;
    }
    static void cbEvent2(const std_msgs::String::ConstPtr& msg) {
            std::cout << "I heard: " << msg->data.c_str() << std::endl;
    }
    static FunctionPointer cbPointer[];
}
FunctionPointer myCallbacks::cbPointer[] = {&myCallbacks::cbEvent1, &myCallbacks::cbEvent2};
#endif

现在我可以使用myCallbacks::cbPointer[x]来引用成员函数的地址。