Be aware of template metaprogramming

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章