C++ 模版的一些知識
- C++中既能編寫函數模版也能實現類模版。
- 編譯器會根據傳入的類型推導出模版的類型,而後再將模版實例化。若是不能根據傳入類型推導出結果,將致使編譯錯誤。
- 若是模版不適用於全部類型,咱們能夠爲一些特殊的類型書寫一些特化模版。咱們能夠對函數模版、類、以及類成員函數進行特化。類模版還能進行部分特化:特化某些模版形參而非所有。
- 函數的特化模版和相同簽名的普通函數有些區別:特化的函數模版要全部的參數的類型都符合纔會被調用,而函數之要求傳入的參數能轉化成指定類型就能夠調用。若是匹配同樣好時,優先選擇普通函數調用。
- 不建議包含函數模版又包含普通函數的重載,由於可能會使函數的用戶感到奇怪。建議在重載時,採用函數模版特化代替普通函數的重載。
- 假如fp是一個函數指針,myTemplate是一個函數模版,咱們能夠寫fp = myTemplate,只要函數模版能經過函數指針的相關類型能推導出來。這樣fp會指向一個實例化的函數。
- 有個函數模版: template<class T> T func(T t); 會用到T類型的內部類size_type,別忘了加上typename: typename T::size_type* p 。
- 有個函數爲 void func(void (*pf)(int)); myTemplate爲符合該函數參數的函數模版。只有一個func時,myTempale是能夠做爲參數傳遞給func的,由於函數模版能推導出相關類型。若是再加上一個func的重載:void func(void (*pf)(double)); 此時 func(myTemplate)就會編譯不過了,由於兩個func中的函數指針都能正確推導函數模版myTemplate,因此就不知道選擇哪一個了。
- 任何模版參數均可以有默認值,也能夠帶有常量,好比1,2.0等等。
- 觀察該函數模版 template<class T1, class T2, class T3> T1 func(T2, T3); 這樣調用 template<int> func(1, 2) 是能夠的,由於T2 T3都能推導出來。
- 和上例作對比,觀察函數模版template<class T1, class T2, class T3> T3 func(T1, T2); 這樣調用 template<int> func(1, 2) 就不行。由於不肯定T3是什麼類型。因此要寫成template<int,int,int> func(1, 2);
- 類模版中的static數據成員,是每一個實例化的類共享一份,好比類C<int>和類C<string>都單獨維護一份static數據成員。
- X const & 等價於 const X & ( X爲一個類名)
- 類成員模版函數不能定義爲Virtual
- 形參:形式上的參數。C++ 11的模版支持變長的參數列表。
- 類模版的實現不能分開寫在.cpp和.h中,通常在.h中寫聲明,而後在.h的最後include一個.hpp,這個.hpp寫了模版的實現。
歡迎關注本站公眾號,獲取更多信息