16.2 實例化
模板是一個藍圖,它本身不是類或函數。編譯器用模板產生指定的類或函數的特定類型版本。產生模板的特定類型實例的過程稱為實例化。
模板在使用時將進行實例化,類模板在引用實際模板類類型時實例化,函數模板在調用它或用它對函數指針進行初始化或賦值時實例化。
1. 類的實例化
類模板的每次實例化都會產生一個獨立的類類型。為int類型實例化的Queue與任意其他Queue類型沒有關系,對其他Queue類型的成員也沒有特殊的訪問權。
2. 類模板形參是必需的
類模板不定義類型,只有特定的實例才定義了類型。特定的實例化時通過提供模板實參與每個模板形參匹配而定義的。模板實參在用逗號分隔並用尖括號括住的形參表中指定。
Queue<int> qi;
Queue<string> qs;
Queue<int> qi;
Queue<string> qs;3. 函數模板實例化
使用函數模板時,編譯器通常會為我們推斷模板實參。
16.2.1 模板實參推斷
從函數實參確定模板實參的類型和值的過程叫做模板實參推斷(template argument deduction)。
1. 多個類型形參的實參必須完全匹配
2. 類型形參的實參的受限轉換
編譯器只會執行兩種轉換:
const轉換:接受const引用或const指針的函數可以分別用非const對象的引用或指針來調用,無需產生新的實例化。如果函數接受非引用類型,形參類型和實參都忽略const。
數組或函數到指針的轉換:如果模板形參不是引用類型,則對數組或函數類型的實參應用常規指針轉換。數組實參將當作指向其第一個元素的指針,函數實參當作指向函數類型的指針。
3. 應用於非模板實參的常規轉換
類型轉換的限制只適用於類型為模板形參的那些實參。
4.模板實參推斷與函數指針
可以使用函數模板對函數指針進行初始化或賦值,這樣做的時候,編譯器使用指針的類型實例化具有適當模板實參的模板版本。
16.2.2 函數模板的顯式實參
1.指定顯式模板實參
2. 在返回類型中使用類型形參
3. 顯式實參與函數模板的指針
摘自 xufei96的專欄