c++ - 如何创建不同原型(prototype)的函数指针数组?

标签 c++ function oop c++14

我有几个这样定义的函数:

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/

相关文章:

c++ - 带有右值引用参数的模板函数内的 std::is_rvalue_reference

C++11 使用代理将成员函数传递给线程

c++ - 重载小于 C++ 中的运算符出现错误

c - 我应该在 scanf() 中同时包含 fflush(stdin) 和空格,还是只包含其中之一就足够了?

matlab - matlab中类库的全局变量

oop - 在应用程序中与 Elastic 通信的最佳实践

python - python 中的默认方法实现(__str__、__eq__、__repr__ 等)

c++ - 使用 NvPipe 编码桌面复制 API ID3D11Texture2D 框架

javascript - 单击我网站上的任何链接 (a) 时如何运行 jQuery 函数

javascript - 如何使用查询选择器?