(C++)使用模板在编译期计算阶乘

来源:互联网 发布:知画生孩子是第几集 编辑:程序博客网 时间:2024/05/22 03:44
在编译期计算阶乘之于模板元编程(template metaprogramming) 正如 helloword 之于初学编程。
using namespace std;template <int SUM, int N>struct Mul;template <int N>struct Fact{enum { sum = Mul<Fact<N - 1>::sum, N>::sum };};template <>struct Fact<1>{enum { sum = 1 };};template <int SUM, int N>struct Mul{enum { sum = SUM + Mul<SUM, N - 1>::sum };};template <int SUM>struct Mul<SUM, 1>{enum { sum = SUM };};int main(){cout << Fact<10>::sum << endl;getchar();return 0;}

代码没有使用一个乘法,也没有一个循环语句,却能在程序运行起来之前就把10的阶乘计算出来,是不是很令人感到不可思议呢!

fact

解释一下。Factorial(阶乘)Multiplication(乘法) 这两个结构中enum(枚举类型)通过递归取得确切的值,而这一工作由于template(模板)的特性,在编译时就已经完成了。

当然上面的代码因为没有用乘法所以显得繁琐了一些,下面的代码则使用了乘法。

using namespace std;template <long N>struct fact{enum {sum = N*fact<N-1>::sum};};template <>struct fact < 1 >{enum {sum = 1};};int main(){cout << fact<10>::sum << endl;getchar();return 0;}




0 0