C ++模板:使用隐式转换为模板实例化类型选择重载函数!

时间:2010-12-14 12:22:51

标签: c++ templates overloading

考虑这些重载函数,

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!

或者如果不可能的话,还是其他任何选择?目标是,应根据不同的积分值调用不同的函数!


修改

顺便说一句,我不能使用以下任何一项:

  1. 使用switch(value)
  2. 使用一些SomeFuncTable funTable[] = {fun(Int2Type<1>(), fun(Int2Type<2>()}

3 个答案:

答案 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>())

无论如何,所有这些只适用于编译时常量。