我正在尝试在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 ...);
答案 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建议的解决方案。