C++泛型編程
1. Conversion function轉換函數
圖中,黃色部分即為轉換函數,轉換函數不需要加返回類型,不需要調用參數,通常加const。轉換函數的作用就是在需要以另外的類型使用一個對象時,自動的將該對象轉換為該類型。
如上圖的實例測試所示,自動的將Fraction型對象f轉換為double類型。
2. non-explicit-one-argument ctornon-explicit的單實參構造函數
上圖中的綠色部分為該類的構造函數,可以以單實參的形式調用。在語句Fraction d2=f+4中,f只能與Fraction對象相加,編譯器就自動的把4轉為Fraction(4,1)。
注意:在需要起碼兩個實參的構造函數中,不會自動完成該轉換。
注意:當轉換函數和non-explicit單實參構造函數同時存在時,語句d2=f+4會報錯,因為編譯器不知道是調用轉換函數還是調用構造函數。但如果在構造函數前面加聲明符explicit的話,構造函數將不會被隱式調用。
3. pointer-like classes,像指針的類
用類來模擬指針的行為,這樣能實現指針的功能,能像指針一樣使用,但同時也能實現更多的功能。比如智能指針shared_ptr、迭代器iterator都是像指針的類。
4. function-like classes,仿函數
仿函數最大的特征就是對operator()進行重載,這樣調用“類名()”這樣的語句時,會使其像函數一樣被調用,但實際上是調用了類中的operator()。
下圖就是STL中的部分仿函數。
仿函數都會繼承這樣一個base classes:
5. namespace命名空間
這個沒什么好談了,就是個命名空間而已,防標識符沖突用的。
6. classes template,類模板
這個簡單,不說了,自己看圖體會。
7. function template,函數模板
這個也簡單,看圖體會
8. member template,成員模板
就是模板中的模板,一般用于繼承關系中,可以使用子類來構造父類
9. specialization,模板特化
泛化的反義詞,在模板中,該模板針對某一特定類型具有與其他類型不一樣的實現時,使用特化。
該模板中,針對char、int、long具有不同的實現,所以對這三個類型分別寫了特化模板。
10. partial specialization,偏特化
分為兩種:
個數的偏:模板里面具有1個以上的泛化類型,只對其中的部分泛化類型進行特化。
范圍的偏:比如對指針類具有不同的實現,那么針對指針類型寫另一個泛化模板,這就是范圍的偏。
11. template template parameter,模板模板參數
這個不知道怎么講,自己不會很理解,感覺很少用,就放個圖自己體會吧。
注意:對于STL的容器,在使用時諸如vector,看似vector只需要一個參數,實際上容器大多都有多個參數,只是除了第一個參數之外都有默認值。
12. variadic templates,數量不定的模板參數
自己可以寫個代碼實現一下圖中的內容,寫一下就理解了。
13. auto
這個就不講了吧,C++基礎知識
14. ranged-base for,范圍for循環
這個也是,一般含有C++11的書里面都有提到,基礎知識。
15. reference
C++相比于C的一個比較大的新東西。
reference通常不用于聲明變量,而是用于函數參數類型和返回類型的描述。