如何使用函数指针数组?

时间:2018-03-17 15:54:40

标签: c++ function-pointers

我想使用这个函数指针数组,而不使用STL。

该数组是一个指针数组,我称之为函数scrollToIndex({index, animated?})OptionA等等。

OptionB

现在,如果我在我拥有数组的函数内写入

int(*Functions[4])();
Functions[0] = OpionA;
Functions[1] = OptionB;
Functions[2] = OptionC;
Functions[0] = Exit;

我希望调用函数'OptionA',之前已经定义了它,例如:

Functions[0];

没有STL可以做到这一点吗? 如果没有,我想知道如何使用STL。

4 个答案:

答案 0 :(得分:3)

您可以像任何其他类型一样创建和传递函数指针数组。如果您有类型别名,这是最简单的(我的示例使用using,但typedef也可以使用)。

#include <iostream>

using Function = int (*)(int, int);

int add(int a, int b) {
    return a + b;
}

int sub(int a, int b) {
    return a - b;
}

void do_stuff(int a, int b, Function * fns, int cnt) {
    for(auto i = 0; i < cnt; ++i) {
        std::cout << "Result " << i << " = " << fns[i](a, b) << '\n';
    }
}

int main() {
    Function fns[2] = { add, sub };
    do_stuff(10, 7, fns, 2);
    return 0;
}

输出:

Result 0 = 17
Result 1 = 3

答案 1 :(得分:0)

我认为你所寻找的是什么 How to initialize a vector of pointers

初始化矢量后,您可以将其发送到普通数据类型的函数。 例如:

std::vector<int*> array_of_pointers{ new int(0), new int(1), new int(17) };
function(array_of_pointers);

在函数声明中

void function(std::vector<int*> array_of_pointers);

我希望这能回答你的问题。

答案 2 :(得分:0)

在C和C ++中,数组是二等的。只有在某种程度上包裹它们时,它们才能通过价值自己传递。

作为第一步,您需要决定的问题是:

  1. 您的阵列是否有固定的长度?
  2. 您是否必须通过值传递 或者您可以通过引用传递 吗?
  3. 如果你必须通过值传递它,那是你想要调用者做出的选择,还是被调用者强加的选择?在第一种情况下,通过引用传递它。

    如果你通过引用传递数组,那么使用gsl::span就没有任何东西可以击败,除非你传递多个具有本质相同长度的序列,在这种情况下传递指针和单个长度参数更有效率舒服。

    如果按值传递可变长度数组,请尝试使用std::vector。这也是传递by-ref参数的首选类型,就像按值一样。

    否则(固定长度的数组,按值),没有什么比std::array更好。

答案 3 :(得分:0)

如果p是一个没有接收参数的函数的指针,你应该用这种语法调用它:

p();

因此,如果array是指向函数的指针数组,则应使用相同的语法思想调用其中一个:

array[0]();

这里的括号很重要;他们说“调用此函数,并不传递任何参数”。如果没有括号

array[0];

这意味着“从数组中选择此函数,但不执行任何操作”。

这是一个无用的表达式,就像你有一个整数x,然后x * 5意味着“将x乘以5而不对结果做任何事”(无用),而{x *= 5 1}}表示“将x乘以5并将x替换为结果”。