如何根据输入值调用函数

How to call a function based on the input value?

本文关键字:值调用 函数 输入 何根      更新时间:2023-10-16

假设我只想在我的代码中调用一个函数:func(),但取决于我给它的值,它是否直接转到该函数的正确"版本"?

我知道这可以用if语句/switch语句来做,但是它必须(低效地)检查传递的是哪个值。我希望有一种预编译的方式来做?

这样的事情可能以一种有效的方式做吗?

func(3)

将执行第三个版本的func()

func[1]{
    cout "One";
}
func[2]{
    cout "Two";
}
func[3]{
    cout "Three";
}

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

int foo_1() {
   cout << "One";
}
// ...
auto[] functions = {foo_1, foo_2, foo_3};
并以 命名
 functions[0]();

实际上,case-switch非常高效,因为即使您有非常多的目标,它也可以在代码中将其编译为跳转表,而不是作为if链-因此switch的所有部分都将是等量的指令。

http://en.wikipedia.org/wiki/Switch_statement编译

如果输入值的范围可识别为"小"且只有a很少的差距,一些编译器合并了一个优化器实际上的分支表或数组来实现switch语句索引函数指针,而不是一长串条件指令。这允许switch语句立即确定执行哪个分支不需要遍历列表比较。

此外:

1)如果你还没有将代码识别为会减慢程序速度的瓶颈,就不要担心过早的优化。

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

当您执行func(3)时,其中参数为常量,如果没有副作用,编译器将自动优化函数。这意味着函数不能修改全局变量、成员变量,也不能写入传递给函数的任何指针。if语句将在运行时消失。

因为我们在这里使用c++,我将使用从string(您的输入)到void *(代表所有函数)的map,这样我就不需要依赖映射中可调用函数的任何特定顺序。我也不需要将输入转换为数字(如果输入来自控制台并且是字符串)

#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;
}

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

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

像这样的东西应该可以工作:)

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

刚刚检查过了。这个解决方案不能像用户所希望的那样工作,因为在字形中输入的值必须是一个常量/编译时解析的值。

您可以使用值模板。但如果你这样做了,为什么要有一个函数呢?为什么不使用N个不同命名的函数呢,这样维护代码时就不会那么混乱了。