TMP沒有真正的循環構件,循環效果由遞歸recursion完成。
TMP是函數式語言functional language,而遞歸對於這類語言是無法分割的。
TMP的遞歸不是正常的遞歸,因爲TMP循環並不涉及遞歸函數調用,而是涉及“遞歸模板具現化”recursive template instantiation。
// 一般情況:Factorial<n>的值是n乘以Factorial<n-1>
template <unsigned n>
struct Factorial
{
enum {val = n * Factorial<n-1>::val };
};
// 特殊情況:Factorial<0>的值是1,我們需要一個特殊情況造成遞歸結束,這裏的特殊情況時template Specialization, Factorial<0>
template <>
struct Factorial<0>
{
enum {val = 1};
};
#include <iostream>
int main() {
std::cout << Factorial<0>::val << std::endl; // 0
std::cout << Factorial<5>::val << std::endl; // 120
std::cout << Factorial<10>::val << std::endl; // 3628800
return 0;
}
Reference
Scott Meyers. Effective C++ , 55 Specific Ways to Improve Your Programs and Designs, Third Edition