所以我有多个函数,否则它们具有相同的名称,但每个函数在函数名的末尾都有不同的数字,如下所示:
void bark0() {
cout << "A small amount of dogs are barking" << endl;
}
void bark1() {
cout << "Some dogs are barking" << endl;
}
void bark2() {
cout << "Bark Bark!" << endl;
}
是否可以从for循环中调用所有这些,以便 int i 成为当前要调用的函数?
for (int i = 0; i < 3; i++) {
// Call bark + i at the end || For example bark2(); when i == 2
}
或者是否可以调用以用户输入的数字结尾的函数?
int input;
cin >> input;
bark+input();
我知道您可以使用指向函数的指针映射,但我想知道是否有一种方法可以调用这样的函数。
编辑:我不想使用参数,因为这些函数应该完全不同。这些树皮0,1和2只是例子。
答案 0 :(得分:5)
您无法在C / C ++中执行此操作,因为编译后函数的名称不是机器代码的一部分。
我会通过创建一个函数指针数组然后调用循环中的索引函数指针来实现此目的。
答案 1 :(得分:4)
其他答案已经解释说你说的方式是不可能的。但没有人阻止你手动做这样的事情:
using func_type = std::function<void()>;
func_type functions[3] = { &bark0, &bark1, &bark2 };
for (int i = 0; i < 3; i++) functions[i]();
答案 2 :(得分:2)
您可以将函数存储为散列映射中的函数作为函子或lambda,它使用整数作为键,并以这种方式循环它们,或者数组而不是映射。
答案 3 :(得分:1)
您可以使用函数的参数而不是这种方式:
void bark(int index) {
cout << "Dog " << index << " is barking" << endl;
}
然后
int input;
cin >> input;
bark(input);
以及您的评论:
我希望这些功能完全不同
没有问题,您也可以使用切换或 来分隔作品
void bark(int index) {
switch(index){
case 1:
// ....
break;
case 2:
// ....
break;
case 3:
// ....
break;
}
请阅读this doc(参见页尾的表格)
答案 4 :(得分:1)
没有。您无法根据运行时确定的名称调用函数。在支持反射的语言中,这种事情是可能的,但c ++不是这种语言。
您可以在简单示例中使用该数字作为函数参数,如Arash Hawaii建议的那样。
这些功能应该是完全不同的东西
在这种情况下,争论不是一个好主意。更好的选择是使用函数指针数组。使用整数输入作为数组的索引。并确保验证输入!