如何根据输入值调用函数?

时间:2013-04-17 04:53:15

标签: c++ function

让我说我只想在我的代码中调用一个函数:func(),但根据我给它的值,让它直接转到该函数的正确'版本'?

我知道这可能与if-statements / switch-statements有关,但是它必须(低效率)检查传递了哪个值。我希望有一种预先编译好的方法吗?

这样的事情有可能以有效的方式进行吗?

func(3)

将执行第三版func()

func[1]{
    cout "One";
}

func[2]{
    cout "Two";
}

func[3]{
    cout "Three";
}

6 个答案:

答案 0 :(得分:6)

你可以有一个函数指针数组:

int foo_1() {
   cout << "One";
}

// ...

auto[] functions = {foo_1, foo_2, foo_3};

并用

调用它
 functions[0]();

答案 1 :(得分:2)

实际上,case-switch非常有效,因为即使你拥有非常多的目标,它也可以在代码中将其编译为跳转表,而不是ifs链 - 所以所有部分都是切换将是相同数量的指令。

http://en.wikipedia.org/wiki/Switch_statement#Compilation

  

如果输入值的范围可识别为“小”并且只有一个   差距很小,一些包含优化器的编译器实际上可能   将switch语句实现为分支表或数组   索引函数指针而不是一系列有条件的   说明。*这允许switch语句立即确定   什么分支执行而不必通过列表   比较。

此外:

1)如果您没有将代码识别为阻碍程序运行的瓶颈,请不要担心过早优化。

2)为什么调用具有不同值的函数会使它完全不同?不应该是不同的功能吗? (如果你想在循环中调用一堆函数,你总是可以创建一个函数指针数组 - 查找函数指针)

答案 2 :(得分:0)

如果func(3)执行参数不变的情况,编译器会自动优化函数(如果它没有副作用)。这意味着该函数可能不会修改全局变量,成员变量或写入传递给函数的任何指针。 if语句将在运行时消失。

答案 3 :(得分:0)

我相信可以使用模板化函数。

例如

template< int subfunc>
void func< subfunc>();

void func<1>();

这样的事情应该有效:)

当你调用它时,你会说:func<1>();它会调用另一个函数。

刚检查过。此解决方案将无法按用户的意愿工作,因为V形中输入的值必须是常量/编译时解析值。

答案 4 :(得分:0)

由于我们在这里使用C ++很难,我会​​使用map string(您的输入)到void *(代表所有函数),这样我赢了我需要依靠地图中可调用函数的任何特定顺序。我也不需要将输入转换为数字(如果输入来自控制台并且它是一个字符串)

#include <map>
#include <string>
#include <iostream>     // for cout

using namespace std;    // that's the way I like it

int main()
{
    map<string, void *> funcs;

    funcs["func1"] = (void *)func1;
    funcs["func2"] = (void *)func2;
    ...

    string s = myinput();
    if (funcs.find(s) != funcs.end()) {
        ((void (*)())funcs[s])();   // call the function (first casting it to the function's data type
    }
    else cout << "### Error: function " << s << " doesn't exist in map" << endl;

    return 0;
}

答案 5 :(得分:-1)

您可以使用值模板执行此操作。但如果你这样做,为什么要有功能?为什么不只是拥有N个不同命名的函数,在维护代码时,FAR就会减少混乱。