在C ++中创建函数指针的跳转表

时间:2013-11-11 23:24:18

标签: c++ function-pointers

我正在尝试在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:'=':无法从'void(__ thiscall myclass :: *)(unsigned char *,int,int)'转换为'myclass :: tfunc' 1 GT;没有可以进行此转换的上下文

我很困惑。

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

3 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:0)

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

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

以上是针对独立功能的。通过指向成员方法的指针执行成员留给读者一个练习(提示:请参阅C ++ faq指向成员的指针)。

答案 2 :(得分:0)

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

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