我很难理解以下模板定义和模板特化定义的工作原理?对我来说,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
答案 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,没有)。