我想使用这个函数指针数组,而不使用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。
答案 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 ++中,数组是二等的。只有在某种程度上包裹它们时,它们才能通过价值自己传递。
作为第一步,您需要决定的问题是:
如果你必须通过值传递它,那是你想要调用者做出的选择,还是被调用者强加的选择?在第一种情况下,通过引用传递它。
如果你通过引用传递数组,那么使用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
替换为结果”。