模板定义中的factorial <t - =“”1 =“”>的含义</t>

时间:2012-02-01 15:01:09

标签: c++ templates template-meta-programming

我很难理解以下模板定义和模板特化定义的工作原理?对我来说,factorial<34>factorial<T-1>看起来很奇怪!

例如:

factorial<T - 1>::value

意味着什么?

#include <iostream>

template<int T>
struct factorial {
  enum { value = factorial<T - 1>::value * T };
};

template<>
struct factorial<1> {
  enum { value = 1 };
};

int main()
{
  std::cout << factorial<34>::value << std::endl;

}    

g++ -o testSTL01 testSTL01.cpp -Wall
testSTL01.cpp: In instantiation of ‘factorial<13>’:
testSTL01.cpp:5:3:   instantiated from ‘factorial<14>’
testSTL01.cpp:5:3:   instantiated from ‘factorial<15>’
testSTL01.cpp:5:3:   instantiated from ‘factorial<16>’
testSTL01.cpp:5:3:   instantiated from ‘factorial<17>’
testSTL01.cpp:5:3:   instantiated from ‘factorial<18>’
testSTL01.cpp:5:3:   [ skipping 11 instantiation contexts ]
testSTL01.cpp:5:3:   instantiated from ‘factorial<30>’
testSTL01.cpp:5:3:   instantiated from ‘factorial<31>’
testSTL01.cpp:5:3:   instantiated from ‘factorial<32>’
testSTL01.cpp:5:3:   instantiated from ‘factorial<33>’
testSTL01.cpp:5:3:   instantiated from ‘factorial<34>’
testSTL01.cpp:15:29:   instantiated from here
testSTL01.cpp:5:3: warning: integer overflow in expression
start to run the app ...

0

2 个答案:

答案 0 :(得分:6)

这是模板元编程的一个例子。该程序使用递归在编译时计算阶乘。递归的基础在这里:

template<>
struct factorial<1> {
  enum { value = 1 };
};

它表示阶乘1为1。

另一个模板只是说数字的阶乘就是这个数字乘以阶乘减1。

template<int T>
struct factorial {
  enum { value = factorial<T - 1>::value * T };
};

由于在经典意义上确实没有“调用”,模板实例化本身,其模板参数等于编译时计算的T-1

P.S。警告显示34的阶乘溢出32位整数。

答案 1 :(得分:5)

这不是一个真正的问题,而是一个声明。模板参数不是类型,但在绝大多数情况下它们类型,因此您可能以前没有看过非类型模板参数。

也就是说,factorial<1>使用专门化(使用value=1),factorial<N>使用N&gt; 1使用一般情况,即factorial<N-1>。这为您提供了阶乘的编译时评估(因为模板以递归方式扩展)。

但你知道34的阶乘有多大吗?你希望它适合整数吗? (答案:295232799039604140847618609643520000000,没有)。