模板聲明 template<typename/class T>, typename比class最近後添加到C++標準。ios
常規模板,具體化模板,非模板函數的優先調用順序。c++
非模板函數(普通函數)> 具體化模板函數 > 常規模板函數
顯示具體化:性能
具體化表示爲某一特定的類型重寫函數模板,聲明的含義是使用獨立的,專門的函數定義顯示地爲 特定類型生成函數定義。spa
爲何要有顯示具體化?處理模板函數所不能處理的特殊狀況。顯式具體化顯式具體化也是基於函數模板的,只不過在函數模板的基礎上,添加一個專門針對特定類型的、實現方式不一樣的具體化函數。.net
顯示具體化聲明在關鍵字template後包含<>.c++11
如: code
vs2013不支持: ci
在發生函數模板的調用時,不顯示給出模板參數而通過參數推演,稱之爲函數模板的隱式模板實參調用(隱式調用)。如:get
1 2 3 4 5 |
|
顯示實例化:
實例:如函數調用swap(i,j)會致使編譯器生成swap()的一個實例,該實例使用 int 類型。
句法:聲明所需的種類用<>符號指示類型,並在聲明前加上關鍵字template:
爲何要有顯示實例化?事實上,編譯器只在要調用函數的時候才使用到函數,若是不使用顯示實例化,每次調用函數時,模板都會消耗性能去推導使用的是哪一個類型的函數,增長了程序運行時的負擔;使用了顯示實例化,則在編譯時就已經處理了函數選擇。
實例化示例:
注意:試圖在同一個文件(或轉換單元)中使用同一種類型的顯示實例化和顯示具體化聲明,會出錯。
推薦:能夠用在函數調用時,直接顯示實例化,而不使用顯示實例化聲明。
如:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
模範代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
|
總結:
隱式實例化指的是:在使用模板以前,編譯器不生成模板的聲明和定義實例。只有當使用模板時,編譯器才根據模板定義生成相應類型的實例。如:int i=0, j=1;swap(i, j); //編譯器根據參數i,j的類型隱式地生成swap<int>(int &a, int &b)的函數定義。Array<int> arVal;//編譯器根據類型參數隱式地生成Array<int>類聲明和類函數定義。
顯式實例化:當顯式實例化模板時,在使用模板以前,編譯器根據顯式實例化指定的類型生成模板實例。如前面顯示實例化(explicit instantiation)模板函數和模板類。其格式爲:template typename function<typename>(argulist);template class classname<typename>;顯式實例化只需聲明,不須要從新定義。編譯器根據模板實現實例聲明和實例定義。
顯示具體化:對於某些特殊類型,可能不適合模板實現,須要從新定義實現,此時可使用顯示具體化(explicite specialization)。顯示實例化需從新定義。格式爲:template<> typename function<typename>(argu_list){...};template<> class classname<typename>{...};