是否可以编写模板
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;
}
谢谢!
编辑:
将上面的代码更改为返回方格,正如许多人猜测的那样(我的要求很差)
答案 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预处理器的信息,可以能够执行您想要的操作。模板适用于类型,并不适合您要执行的操作。