让我说我只想在我的代码中调用一个函数:func(),但根据我给它的值,让它直接转到该函数的正确'版本'?
我知道这可能与if-statements / switch-statements有关,但是它必须(低效率)检查传递了哪个值。我希望有一种预先编译好的方法吗?
这样的事情有可能以有效的方式进行吗?
func(3)
将执行第三版func()
func[1]{
cout "One";
}
func[2]{
cout "Two";
}
func[3]{
cout "Three";
}
答案 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就会减少混乱。