0

我正在尝试在 C++ 中创建一个函数指针数组,我可以将其用作跳转表。这些功能都是原型

void(unsigned char*, int, int)

所以我想我会做

typedef void (*func)(unsighed char*, int, int);

接着

func tfunc[256];

然后像这样设置各个元素:

tfunc[0]=func01;

但后来我得到“函数调用缺少参数列表;使用'&myclass::func01'”

但是当我尝试

tfunc[0]=&myclass::func0;

我收到“错误 C2440: '=' : cannot convert from 'void (__thiscall myclass::* )(unsigned char *,int,int)' to 'myclass::tfunc' 1> 没有上下文可以进行这种转换可能的

我很困惑。

我想我通过在标题中添加 MyClass:: 来修复它: tyepdef void (MyClass::*func...);

4

3 回答 3

1

可以使用std::function<void(unsigned char*, int, int)>您的函数数组并使用以下方法适当地绑定您的对象std::bind()

using namespace std::placeholders;
std::function<void(unsigned char*, int, int)> tfunc[256];
tfunc[0] = std::bind(&myclass::func0, this, _1, _2, _3);

在所有情况下,使用都比使用std::function<Signature>函数指针更好,因为它允许通过必要的上下文,例如,指向对象的指针。如果您真的只想调用函数并且不需要对象,您仍然可以使用std::function<...>并创建您的func0成员static。在这种情况下,您仍然可以使用std::bind(),但实际上并不需要:

struct myclass {
    static void func0(unsigned char*, int, int);
};
// ...
tfunc[0] = std::bind(&myclass::func0, _1, _2, _3);
tfunc[0] = &myclass::func0;

对于动态多态的爱好者:内部std::function<...>有一个继承层次结构,任何具体的初始化都会根据需要实例化一个派生类。唯一真正的区别是您不需要为创建层次结构而烦恼,并且一些实现会做一些聪明的事情来提高效率。

于 2013-11-12T00:08:25.263 回答
0

如果要将类成员函数放入数组中,则应声明类成员函数static

如果您的类成员函数不是静态的,那么您必须“绑定”this它,它会强制您使用@Dietmar 建议的解决方案。

于 2013-11-12T01:37:24.883 回答
0

即使你有一个指向 {static} 函数的指针数组或指向成员的指针,你仍然需要在调用函数时传递参数:

(*vector_of_functions[i])(param1, param2, param3);

以上是针对独立功能的。通过指向成员方法的指针执行成员作为练习留给读者(提示:请参阅指向成员的 C++ 常见问题解答指针)。

于 2013-11-12T00:10:46.637 回答