【C/C++】【模板和泛型】類模板
阿新 • • 發佈:2020-08-03
概述
- 用類模板例項化一個特定的類;
- 編譯器不能為類模板推斷模板引數,為了使用類模板,必須在模板名後用<>來提供額外的資訊;
- 同一套程式碼,可以應付不同的資料型別;
類模板定義
-
格式
template <typename T, ...> class name { }
-
例項化類模板的時候,必須要有類的全部資訊,包括類模板中成員函式的函式體;
類模板的成員函式
- 類模板成員函式可以寫在類模板定義中,這些成員函式被隱式宣告為行內函數;
- 把成員函式的函式體(函式具體實現)放在類模板的定義中;
- 類模板一旦被例項化之後,那麼這個模板的每個例項都會有自己版本的成員函式;所以,類模板的成員函式具有和這個類模板相同的模板引數;類模板的成員函式有模板引數;
- 如果把類模板成員函式的定義(函式體)寫在類模板定義的外邊;那麼這個成員函式的模板引數就體現出來了
- 定義在類模板之外的成員函式必須以關鍵字template開始,後邊接類模板引數列表,同時在類名後面用尖括號<>把模板引數列表裡面的所有模板引數名列出來,如果是多個模板引數,用逗號分隔;
- 一個類模板可能有很多成員函式,但是當例項化模板之後,成員函式只有在被使用的時候才會被例項化;沒有使用到就不會被例項化;
//vector實現 template<typename T> class my_vector { public: typedef T* iter; //迭代器 public: my_vector(); //在類模板內部使用模板名並不需要提供模板引數;也可以加 my_vector& operator=(const my_vector&); //my_vector<T>& operator=(const my_vector<T>&); iter begin(); iter end(); void func(); }; template<typename T> void my_vector<T>::func() { return; } //建構函式 template<typename T> my_vector<T>::my_vector() { } template<typename T> my_vector<T>& my_vector<T>::operator=(const my_vector<T>&) { return *this; } int main() { my_vector<int> i_vec; return 0; }
非型別模板引數
- 浮點數不能做非型別模板引數;
- 類型別一般也不允許做非型別模板引數;
template<typename T, int size = 10> class Arr { private: T arr[size]; public: void func(); }; template<typename T, int size> void Arr<T, size>::func() { cout << size << endl; return; } int main() { Arr<int, 100> a; Arr<int> b; return 0; }