我有几个这样定义的函数:
ParentClass* fun1();
ParentClass* fun2();
ParentClass* fun3(bool inp=false);
ChildClass* fun4();
ChildClass* fun5(int a=1, int b=3);
我想将它们放入某种数组中,如下所示:
void* (*arr[5])() = {
(void* (*)())fun1,
(void* (*)())fun2,
(void* (*)())fun3,
(void* (*)())fun4,
(void* (*)())fun5
}
现在我想简单地使用这个函数数组
for(int i=0; i<5; i++)
someFunction(arr[i]());
现在我意识到问题是 void* (*arr[5])()
,但鉴于我只想使用函数而不提供参数,我想要所有这些是同一个数组的一部分。
不过,这些都是非常 C 风格的方法。有没有更好的方法来使用 C++ 中的模板?
最佳答案
C 风格与否,你所拥有的是直接未定义的行为。使用 lambda:
void (*arr[5])() = {
[] { fun1(); },
[] { fun2(); },
[] { fun3(); },
[] { fun4(); },
[] { fun5(); }
};
这些都可以,因为它们通过函数的正确类型执行调用,并且它们本身可以转换为 void (*)()
。
转发返回的值非常简单,因为 lambda 为转换提供了上下文。在您的情况下,由于 ChildClass
应该继承自 ParentClass
,因此隐式转换就足够了:
ParentClass *(*arr[5])() = {
[]() -> ParentClass * { return fun1(); },
[]() -> ParentClass * { return fun2(); },
[]() -> ParentClass * { return fun3(); },
[]() -> ParentClass * { return fun4(); },
[]() -> ParentClass * { return fun5(); }
};
关于c++ - 如何创建不同原型(prototype)的函数指针数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53628791/