C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义
1. 定義
類似函數模板,類模板以關鍵字template開始,后跟模板參數列表。在類模板(及其成員)的定義中,我們將模板參數當作替身,代替使用模板時用戶需要提供的類型或值:
template <typename T> class Blob {public:typedef T value_ type;typedef typename std: :vector<T>: :size_ type size_ type;//構造函數B1ob() ;Blob(std: :initializer_ list<T> il) ;// Blob中的元素數目size_ type size() const { return data->size(); }bool empty() const { return data->empty(); }//添加和刪除元素void push_ back (const T &t) {data->push_ _back(t) ; }//移動版本,參見13.6.3節(第484頁)void push_ back(T &&t) { data->push_ back(std: :move(t)); }void pop_ back() ;//元素訪問T& back() ;T& operator[] (size_ _type i); // 在14.5節(第501頁)中定義private:std: :shared ptr<std: :vector<T>> data;//若data[i]無效,則拋出msgvoid check(size_ type i, const std: :string &msg) const; };Blob模板有一個名為T的模板類型參數,用來表示Blob保存的元素的類型。eg,我們將元素訪問操作的返回類型定義為T&。當用戶實例化Blob時,T就會被替換為特定的模板實參類型。
1.1 實例化類模板
- 顯式模板實參( explicit template argument)列表,
當使用一個類模板時,我們必須提供額外信息。 額外信息被綁定到模板參數。編譯器使用這些模板實參來實例化出特定的類。
eg.
Blob<int> ia; // 空Blob<int> Blob<int> ia2 = {0,1,2,3,4}; // 有5個元素的Blob<int>ia和ia2使用相同的特定類型版本的Blob (即Blob)。從這兩個定義,編譯器會重寫Blob模板,將模板參數T的每個實例替換為給定的模板實參,實例化出一個與下面定義等價的類:
template <> class Blob<int> { typedef typename std: :vector<int>: :size_ type size_ type;Blob() ;Blob(std: :initializer_ list<int> il) ;//...int& operator[] (size_ type i) ;private:std: :shared_ ptr<std: :vector<int>> data;void check(size_ type i, const std: :string &msg) const; };-
對我們指定的每一種元素類型, 編譯器都生成一一個不同的類:這兩個定義會實例化出兩個不同的類。names的定義創建了一個Blob類,每個T都被替換為string。prices的定義生成了另一個Blob類,T被替換為double.
-
一個類模板的每個實例都形成一個獨立的類。類型Blob 與任何其他Blob類型都沒有關聯,也不會對任何其他Blob類型的成員有特殊訪問權限。
1.2 在模板作用域中引用模板類型
一個類模板中的代碼如果使用了另外-一個模板,通常不將一一個實際類型(或值)的名字用作其模板實參。相反,通常將模板自己的參數當作被使用模板的實參。
eg,我們的data成員使用了兩個模板,vector和shared_ ptr
std: :shared_ _ptr<std: :vector<T>> data; Blob<string> => data 為shared_ ptr<vector<string>> Blob<int> => data為shared_ ptr<vector<int>>總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EOS 链上治理
- 下一篇: C++ Primer 5th笔记(cha