TMP 是在編譯期運行的 C++ 程序,輸出經模板實例化生成的源碼片段,再由編譯器正常編譯。它被「發現」而非發明,證明為圖靈完備。
advance 的 TMP 優化運行時 typeid 版本會導致非隨機迭代器編譯錯誤(iter += d 不合法)。Traits 技術(TMP 形式)在編譯期分離不同迭代器類別的代碼,避免無效代碼參與編譯。
template<unsigned n> struct Factorial {
enum { value = n * Factorial<n-1>::value };
};
template<> struct Factorial<0> { enum { value = 1 }; };
// 使用:Factorial<5>::value == 120
Factorial<n> 引用 Factorial<n-1>)。enum hack 定義的整型常量。Factorial<0>。constexpr、別名模板、變參模板、概念等原生支持 TMP 的特性。