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寫了模版的實現。
相關文章
相關標籤/搜索