用于生成switch语句部分的C ++模板?

时间:2010-01-28 19:07:25

标签: c++ templates switch-statement

是否可以编写模板

Foo<int n>

这样:

Foo<2>

给出

switch(x) {
  case 1: return 1; break;
  case 2: return 4; break;
}

,而

Foo<3>

给出

switch(x) {
  case 1: return 1; break;
  case 2: return 4; break;
  case 3: return 9; break;
}

谢谢!

编辑:

将上面的代码更改为返回方格,正如许多人猜测的那样(我的要求很差)

5 个答案:

答案 0 :(得分:5)

是的,使用超大的主人switch创建一个模板,并希望/帮助优化器将其变成一个小switch。请参阅我对您的其他问题Runtime typeswitch for typelists as a switch instead of a nested if's?的回答。另外,不要重复发帖。

答案 1 :(得分:2)

如果您启用的值(在本例中为switch)未知,则您将无法使用template metaprogramming来评估x的结果编译时间。这是因为模板在编​​译时被烧毁,而不是在运行时。

但是,如果您在编译时知道该值,则可以实现类似的效果:

#include <cstdlib>
#include <iostream>
using namespace std;

template<int V> struct intswitch
{
    operator int() const
    {
        return V * V;
    }
};

int main() {

    cout << "1 = " << intswitch<1>() << endl
        << "2 = " << intswitch<2>() << endl
        << "3 = " << intswitch<3>() << endl
        << "4 = " << intswitch<4>() << endl
        << "5 = " << intswitch<5>() << endl
        << "6 = " << intswitch<6>() << endl
        << "7 = " << intswitch<7>() << endl
        << "8 = " << intswitch<8>() << endl
        << "9 = " << intswitch<9>() << endl
        << "10 = " << intswitch<10>() << endl
        ;
}

节目输出:

1 = 1
2 = 4
3 = 9
4 = 16
5 = 25
6 = 36
7 = 49
8 = 64
9 = 81
10 = 100

答案 2 :(得分:2)

Sort-a,kind-a,不是真的。你可以得到一些接近你要求的行为的东西,尽管没有用实际的开关来完成。

好的,我假设foo<N>表示能够计算1到N之间的任何值的平方,但没有其他值。所以,我想出了这个:

template <int t>
int foo(int x)
{
    return (x > t)   ? -1 :
           (x == t)  ? (x * x) :
                       foo<t -1>(x);
}    

template <>
int foo<0>(int x)
{
    return -1;
}

答案 3 :(得分:0)

不,你需要一个像这个伙伴那样的查找表。

答案 4 :(得分:0)

我不相信你实际上在这里寻找模板,而是宏。请尝试this reference获取有关C预处理器的信息,可以能够执行您想要的操作。模板适用于类型,并不适合您要执行的操作。