我對C++ Traits編程技法的一點點理解

第一次聽說traits是在一次電話面試中,當時還沒有聽說過這個詞。之後查過資料,但也不是十分明白,直到今天重新看了一下《STL源碼剖析》,稍微有一些想法。

1. traits是模板編程裏面的一個編程技法。可能因爲不是面向對象的,所以算不上一種設計模式。雖然traits本身一般實現爲模板(itrator_traites<T>,以及__type_traits<T>等),但和智能指針(auto_ptr<T>)這種比較大衆的模板相比,traits的用法又有點寬泛,所以感覺說traits是一種編程技法是比較保險的。

2. traits是STL裏面非常重要的概念,所以我覺得用STL來體會traits是有幫助的。而提起STL,其主要內容就是容器和算法,連接兩者的的紐帶就是迭代器。由於迭代器遇到了一些問題,於是需要traits這種技法的幫助。當然也可能是先有traits這種技法,然後才決定用迭代器以及容器和算法分離的方式來實現STL。

3. traits是“萃取”還是“特性”的意思?侯捷說是“特性萃取機”和“榨汁機”。我的理解是,通過偏特化的機制,把特性信息過濾出來——榨汁。比如下面的特化版本,分別把T*和const T*過濾出來T。從而解決了原生指針提取類型特徵的問題。

template<class T>
struct iterator_traits<T*> {
    typedef T value_type;
};

template<class T>
struct iterator_traits<const T*> {
    typedef T value_type;
};
4. 在iterator中,traits除了解決value type的問題,還可以提取其他的4種類型信息:iterator category、difference type、pointer、reference。在__type_traits<T>中,traits用來提取類的拷貝控制和析構的類型,其用法也有點傻,內建類型都hard code了一遍,例如__type_traits<char>。

5. 上網看了看其他人的講解,各自有各自的例子,但都沒有STL iterator的好理解,所以還是看不懂,然後也不知道我自己的理解是否正確。所以先寫出來,等以後回頭再看的時候,有個對比吧。

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