Item 48: Be aware of template metaprogramming.
模板元編程(Template Metaprogramming,TMP)就是利用模板來編寫那些在編譯時運行的C++程序。模板元程序(Template Metaprogram)是由C++寫成的,運行在編譯器中的程序。當程序運行結束後,它的輸出仍然會正常地編譯。
C++並不是為模板元編程設計的,但自90年代以來,模板元編程的用處逐漸地被世人所發現。
在Item 47中提到了這樣一個std::advance
的實現:
template
void advance(IterT& iter, DistT d) {
if (typeid(typename std::iterator_traits::iterator_category) ==
typeid(std::random_access_iterator_tag)){
iter += d;
}
...
}
list::iterator it;
advance(it, 10);
其實上述代碼是不能編譯的,設想以下advance
中的這條語句:::iterator, int>
iter += d;
list
是雙向迭代器,不支持+=
運算。雖然上述語句不會執行,但編譯器不知道這一點。 編譯時這條語句仍然會拋出類型錯誤。
TMP後來被證明是圖靈完全的,這意味著TMP可以用來計算任何可計算的問題。你可以聲明變量、執行循環、編寫和調用函數等等。 但它的使用風格和普通C++完全不同。
我們來看看TMP中如何執行一個循環:
template
struct Factorial{
enum{ value = n * Factorial::value };
};
template<>
struct Factorial<0>{
enum{ value = 1 };
};
int main(){
cout<::value;
}
這是一個典型的TMP例子,其低位就像是普通編程語言中的”hello world”一樣。
為了更好地理解TMP的重要性,我們來看看TMP能干什麼: