終於到了 Templates and Generic Programming 的尾聲。這個章節包含許多重要觀念,需要停下腳步用心思考。明天又是小測驗時間,跟著 Yoyo 一起檢核吸收程度吧!
在撰寫泛型函式時,需根據迭代器類型執行不同的操作。而 C++ STL 定義了五種迭代器類別,各自支援不同的操作。
istream_iterator
ostream_iterator
unordered_map
map
、list
、set
vector
、string
、deque
Traits 是一種 C++ 程式設計技巧,透過 typedef
在類別中添加型別資訊,在編譯時取得型別資訊。
template<typename IterT>
struct iterator_traits {
typedef typename IterT::iterator_category iterator_category;
};
當迭代器類型是內建指標時,需進行模板特化以支持指標所屬的 random access iterator 類型:
template<typename IterT>
struct iterator_traits<IterT*> {
typedef random_access_iterator_tag iterator_category;
};
模板元程式設計是一種基於模板的 C++ 編程技術,它允許程式在編譯時期執行。通過模板的遞迴實例化或特化等機制,生成完整的 C++ 原始碼,並經由編譯器進行常規的編譯過程最終轉化成執行檔。
TMP 的兩大特點:
template<unsigned n>
struct Factorial {
enum { value = n * Factorial<n-1>::value };
};
template<>
struct Factorial<0> {
enum { value = 1 };
};
TMP 的常見應用如下,在 HFT 等需要數學計算的領域有巨大的價值: