第16章 模板與泛型程式設計 5

2022-09-23 08:18:15 字數 1061 閱讀 1422

16.2 例項化

模板是乙個藍圖,它本身不是類或函式。編譯器用模板產生指定的類或函式的特定型別版本。產生模板的特定型別例項的過程稱為例項化。

模板在使用時將進行例項化,類模板在引用實際模板類型別時例項化,函式模板在呼叫它或用它對函式指標進行初始化或賦值時例項化。

1. 類的例項化

類模板的每次例項化都會產生乙個獨立的類型別。為int型別例項化的queue與任意其他queue型別沒有關係,對其他queue型別的成員也沒有特殊的訪問權。

2. 類模板形參是必需的

類模板不定義型別,只有特定的例項才定義了型別。特定的例項化時通過提供模板實參與每個模板形參匹配而定義的。模板實參在用逗號分隔並用尖括號括住的形參表中指定。

queue qi; 

queue qs; 

queue qi;

queue qs;3. 函式模板例項化

使用函式模板時,編譯器通常會為我們推斷模板實參。

16.2.1 模板實參推斷

從函式實參確定模板實參的型別和值的過程叫做模板實參推斷(template argument deduction)。

1. 多個型別形參的實參必須完全匹配

2. 型別形參的實參的受限轉換

編譯器只會執行兩種轉換:

const轉換:接受const引用或const指標的函式可以分別用非const物件的引用或指標來呼叫,無需產生新的例項化。如果函式接受非引用型別,形參型別和實參都忽略const。

陣列或函式到指標的轉換:如果模板形參不是引用型別,則對陣列或函式型別的實參應用常規指標轉換。陣列實參將當作指向其第乙個元素的指標,函式實參當作指向函式型別的指標。

3. 應用於非模板實參的常規轉換

型別轉換的限制只適用於型別為模板形參的那些實參。

4.模板實參推斷與函式指標

可以使用函式模板對函式指標進行初始化或賦值,這樣做的時候,編譯器使用指標的型別例項化具有適當模板實參的模板版本。

16.2.2 函式模板的顯式實參

1.指定顯式模板實參

2. 在返回型別中使用型別形參

3. 顯式實參與函式模板的指標

摘自 xufei96的專欄

第16章 模板與泛型程式設計 10

16.4.4 queue和queueitem的友元宣告 1.將類模板設為友元 template class queueitem type item queueitem next friend class queue 2.queue輸出操作符 template ostream operator ost...

第16章 模板與泛型程式設計 13

16.5 乙個泛型控制代碼類 16.5.1 定義控制代碼類 ifndef handle h define handle h include stdafx.h include using namespace std templateclass handle t operator t operator ...

第16章 模板與泛型程式設計 15

16.6.2 類模板的特化 1.定義類特化 template class queue const string front const void push const char void pop bool empty const friend ostream operator ostream os,...