考虑这些重载函数,
void fun(Int2Type<1>) {}
void fun(Int2Type<2>) {}
void fun(Int2Type<3>) {}
void fun(Int2Type<4>) {}
我想以这种方式称呼这些,
fun(1); // this should call first function
fun(4); // this should call fourth function
有办法吗?如果是,那么我们也可以用一些运行时值来做同样的事情,比如说, (请注意,在上面的调用中,参数在编译时是已知的)
fun(value); // value can be decided at runtime!
或者如果不可能的话,还是其他任何选择?目标是,应根据不同的积分值调用不同的函数!
顺便说一句,我不能使用以下任何一项:
switch(value)
SomeFuncTable funTable[] = {fun(Int2Type<1>(), fun(Int2Type<2>()}
等答案 0 :(得分:2)
不,没有办法将运行时值用作模板参数。你唯一能做的就是:
void fun(int x) {
switch(x) {
case 1:
fun(Int2Type<1>());
break;
case 2:
fun(Int2Type<2>());
break;
case 3:
fun(Int2Type<3>());
break;
case 4:
fun(Int2Type<4>());
break;
}
}
答案 1 :(得分:2)
没有办法完成你想要的东西,因为它们都归结为同样的东西 - 跳转表或大量的if / else。而已。任何其他功能都将成为那样。只需要跳转表。您可以使用函数指针数组(最快)或更灵活的内容,如unordered_map<int, std::function<void()>>
。
哦,除非您想在自己需要的时候编写自己的JIT编译器和JIT新的汇编代码。你可以这样做。但我真的没有看到这一点,因为你仍然遇到同样的问题 - 如何选择要采用的代码路径,这将成为一个跳转表或if / else链。
答案 2 :(得分:2)
你可以用不同的方式做到这一点:
template<int N> void func();
template<> void func<1>(){/*the body*/}
template<> void func<2>(){/*the body*/}
然后你可以打电话:func<1>()
。
或者您可以通过这种方式调用原始代码:func(Int2Type<1>())
。
无论如何,所有这些只适用于编译时常量。