【问题标题】:How to use an array of pointers to functions?如何使用指向函数的指针数组?
【发布时间】:2018-03-17 15:54:39
【问题描述】:

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

该数组是一个指针数组,我将其称为函数OptionAOptionB 等等。

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

现在,如果我在我有数组的函数内部写代码

Functions[0];

我想在之前定义的地方调用函数“OptionA”,例如:

int OptionA()
{
    cout << "OPTION A";
    _getch();
    return 0;
}

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

【问题讨论】:

  • 如果你使用 std::arraystd::vector 而不是 C 样式的数组,会容易得多。
  • 为什么不想使用 STL?您的示例也完全不清楚您想要做什么
  • 那么,你能告诉我一个如何做到这一点的例子吗?我从来没有用过 STL,也许这就是原因
  • 指向函数的指针数组(函数指针)还是指向其他对象的指针数组?
  • 您可能想澄清您的问题。现在看起来,很难猜出你真正想要达到的目标。也许你可以发布你不成功的尝试去做你需要做的任何事情?也许您可以在不知道该放什么的地方发布更广泛的代码?也许更好地解释你真正想要做什么?你可以edit你的问题澄清一下。

标签: c++ function-pointers


【解决方案1】:

您可以像任何其他类型一样创建和传递函数指针数组。如果你有一个类型别名,这是最简单的(我的例子利用了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

【讨论】:

  • 我会回应一些 cmets 提出的问题:如果可能,您应该使用 stl(arrayvector),但这回答了您的具体问题。
【解决方案2】:

我认为您正在寻找的是
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);

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

【讨论】:

  • 不完全是,我已经编辑了我的问题,希望现在更清楚。
【解决方案3】:

在 C 和 C++ 中,数组是二等的。它们不能通过自己的值传递,除非以某种方式包装。

作为第一步,您必须决定的问题是:

  1. 您的数组是否有固定长度?
  2. 您必须按值传递还是可以按引用传递

如果你必须按值传递它,这是你希望调用者做出的选择,还是被调用者强加的选择?在第一种情况下,通过引用传递它。

如果您通过引用传递数组,那么使用gsl::span 没有什么比这更好的了,除非您传递多个序列,它们本质上都具有相同的长度,在这种情况下,传递指针和单个长度参数会更有效并且可能更舒服。

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

否则(固定长度的数组,按值),没有什么能比得上std::array

【讨论】:

  • 不正确,数组可以是一流的,但前提是它们是在结构中定义的。这类似于 std::array。
【解决方案4】:

如果p 是一个指向函数的指针,它不接收任何参数,你应该使用这个语法来调用它:

p();

所以,如果array 是一个指向函数的指针数组,你应该使用相同的语法思想来调用其中一个:

array[0]();

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

array[0];

这意味着“从数组中选择这个函数,但什么也不做”。

这是一个无用的表达式,比如如果你有一个整数x,那么x * 5 的意思是“将x 乘以5,并且对结果不做任何事情”(无用),而x *= 5 的意思是“乘以@987654330 @ 由 5 替换 x 为结果"。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多