如何根据输入值调用函数
How to call a function based on the input value?
假设我只想在我的代码中调用一个函数: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个不同命名的函数呢,这样维护代码时就不会那么混乱了。
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 使用基类指针调用基类的值构造函数的语法是什么?
- 在按值调用 (c++) 中转发构造函数参数
- VkSurfaceKHR 指针的值在函数调用后更改,无需任何显式赋值
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 调用值构造函数而不是复制构造函数
- 为什么或何时应在调用之前将可调用函数参数强制转换为右值?
- 地址处的 C++ 值与函数调用后的预期值不同
- 显式调用普通默认构造函数会导致额外的赋值调用
- 在 OOP 中,调用函数返回值还是直接调用值更快?
- 使用布尔值稍后返回还是调用函数并立即返回更快?C++
- 未调用右值构造函数
- 强制实施调用函数应向被调用函数返回的值添加常量的规则
- 枚举值依赖函数调用
- 为什么当数组作为调用方函数中的参数传递时,不能在被调用函数中使用 foreach 循环打印数组的值
- 调用函数时,引用非常量的初始值必须是左值
- C++函数调用 lambda obj,按值调用比按引用调用快
- 如何根据输入值调用函数
- 复制构造函数——用相同的变量按值调用函数两次会导致问题