如何遍历函数[i]()?

时间:2014-01-11 23:32:18

标签: c++ function iterator

感谢阅读。我是编程新手,我正在尝试编写一个迭代所有i值的函数。例如,它可能是function3(),然后迭代到随机函数12()。这就是我到目前为止所做的:

int main()
{
    trigFunction();
    system("pause");
    return 0;
}

void trigFunction()
{
    int i;
    cout << "Welcome to Haris's Unit Circle Fun House!\n";
    srand(time(NULL));
    i = rand()%15;
    for (int x = 1; x < 15; x++)
    {
        functioni(); //This is obviously wrong. Is there way to do this correctly?
        i = rand() % 15;
    }

}

functioni()我在下面定义了文本,例如:

void function3()
{
    cout << "What is 5pi/3 in degrees?\n";
    cin >> answer;
    if (answer == 300)
    {
        cout << "Correct answer!\n";
    }
    else
    {
        cout << "Wrong Answer!\n";
    }
}
void function4()
{
    cout << "What is 3pi/2 in degrees?\n";
    cin >> answer;
    if (answer == 270)
    {
        cout << "Correct answer!\n";
    }
    else
    {
        cout << "Wrong Answer!\n";
    }
}

非常感谢!

编辑:有没有办法将数组实现到函数结构中?就像功能一样?

2 个答案:

答案 0 :(得分:5)

要记住的是,在运行时,函数名称不再存在。至少,不是一种你可以可靠和便携地用来查找功能的形式。

你必须以某种方式将名称(或者,在这种情况下,只是数字)映射到函数。一种简单的方法是使用数组。

typedef void (*pfun)();
pfun functions[] = { function0, function1, function2, function3, function4 };

然后你可以调用functions[i]();注意,数组索引从0开始,如果i获得的值不正确,事情将会严重破坏。

答案 1 :(得分:2)

您的方法的问题是必须在编译时知道跳转到任何函数(发送到处理器的低级指令)。由于您的迭代值可能会根据编译时未知的变量而更改,因此这不起作用。但是,有一种解决方法 - 使用函数对象。

函数对象存储了获取函数所需的跳转,但它的作用类似于可以复制的普通变量,更重要的是存储在基于索引的数组中。这允许您将函数对象存储在数组中,以便func_array[3]是指向function3的函数对象。

#include <functional>

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

int main() {
    std::function<int(int, int)> func = myfunc;
    int c = func(6, 9);
    return 0;
}

这是一个粗略的例子,但它应该可以帮助你创建一个带有指向你所有函数的函数对象的数组。

请注意,这是一个使用C ++ 11的示例,而hvd的答案是C ++ 03方法。