C++模板实战4:模板特化
生活随笔
收集整理的這篇文章主要介紹了
C++模板实战4:模板特化
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? ?模板設(shè)計的目的就是為了通用,但是某些情形下也有特殊情形獨立于通用規(guī)則,因此模板需要針對特殊情形進(jìn)行特化。
1 ?類模板的特化,在模板類名自后<>內(nèi)寫上特化的類型名,其中<>這部分叫做匹配式,如下:
template<typename T,typename N>//通用模板 void show();template<>//特化模板的模板參數(shù),這里不再需要參數(shù)故為空,<>不能省略 void show<int,char>();//特化模板,其中<int>叫匹配式 特化規(guī)則如下:? 1) 匹配式寫在模板類名之后,用<>包住,即使模板特化沒有引入新的類型參數(shù),<>也不能省略
? 2) 匹配式內(nèi)用逗號隔開的項目列表,如前面的<int,char>,且項目數(shù)目必須和通用模板參數(shù)個數(shù)一致,也就是這里通用模板參數(shù)是T、N,所以特化時不能類似于show<int>
? 3) 匹配式中各項目類型須與通用模板參數(shù)類型一致
? 4) 匹配式項目可以是具體的模板參數(shù)值,也可以是特化成具體的類型
? 5) 當(dāng)匹配式項目是類型模板參數(shù)時,與函數(shù)變量類似,模板參數(shù)也可以用*、&、const、volatile等修飾
? ?實例如下:
//用于模板型模板參數(shù)的模板 template<typename T, int i> struct S1;//模板通例,有三個模板參數(shù),分別是類型參數(shù),非類型參數(shù)及模板型參數(shù) template<typename T, int i, template<typename, int> class SP>//通用模板 struct S;//特例1,可匹配S<char, 任意整數(shù), S1> template<int i, template<typename, int> class SP> struct S<char, i, SP>;//特例2,可匹配S<任意有const修飾的類型, 任意整數(shù), S1> template<typename T, int i, template<typename, int> class SP> struct S<const T, i, SP>;//特例3,完全特例,只能匹配S<char, 10, S1> template<>//此例是完全特化,其余是部分特化 struct S<char, 10, S1>;//特例4,以模板實例作為類型參數(shù)值。匹配S<S1<任意類型, 10>, 10, S1> template<typename T> struct S<S1<T, 10>, 10, S1>;//特例5,錯誤!匹配式項目數(shù)與通例參數(shù)數(shù)不一致 // template<typename T, int i, template<typename, int> class SP, typename TT> // struct S<T, i, SP, TT>;//特例6,錯誤!匹配式項目類型與通例參數(shù)類型不同 // template<typename T> // struct S<char, 10, T>;//特例7,錯誤!模板型參數(shù)SP與通例中SP類型不一致 // template<typename T, int i, template<typename> class SP> // struct S<const T, i, SP>;2 ?類模板匹配按照 最佳匹配原則進(jìn)行匹配,實例如下: #include <iostream>template<typename T0, typename T1, typename T2> struct S {std::string id() {return "General";} };//特例1,約束第三參數(shù)必須為char template<typename T0, typename T1> struct S<T0, T1, char> {std::string id() {return "Specialization #1";} };//特例2,約束第二、第三參數(shù)必須均為char template<typename T0> struct S<T0, char, char> {std::string id() {return "Specialization #2";} };//特例3,約束第一參數(shù)必須為int,且第二、第三參數(shù)相同 template<typename T> struct S<int, T, T> {std::string id() {return "Specialization #3";} };int main() {using namespace std;cout << S<float, float, float>().id() << endl; //Generalcout << S<int, int, int>().id() << endl; //Specialization #3cout << S<int, int, char>().id() << endl; //Specialization #1cout << S<char, char, char>().id() << endl; //Specialization #2//cout << S<int, char, char>().id() << endl; //可匹配2、3,有歧義 }
3 函數(shù)模板特化與重載函數(shù),當(dāng)函數(shù)模板完全特例化后和重載函數(shù)類似,但是模板實例化代碼是編譯器在編譯期展開的所以是內(nèi)聯(lián)的。多個模板實例或用相同類型的普通函數(shù)混合在一起的時候函數(shù)的匹配規(guī)則如下:
?1) 最佳匹配原則,按照實參和形參的匹配程度最優(yōu)選擇
?2) 普通函數(shù)優(yōu)先于模板實例
?3) 模板實例間特化程度高的優(yōu)先級高
? 實例如下:
#include<iostream> using namespace std; template<typename T,typename N> void fun(T x,N y){cout<<"#1 "<<x<<" "<<y<<endl; } template<typename T> void fun(T x,int y){cout<<"#2 "<<x<<" "<<y<<endl; } //template<typename T>//函數(shù)模板不允許部分特化,只能完全特化 //void fun<T,char>(T x,char y){ // cout<<"#3 "<<<<x<<" "<<y<<endl; //} template<> void fun<char,char>(char x,char y){//完全特化cout<<"#4 "<<x<<" "<<y<<endl; } template<> void fun(double x,double y){cout<<"#5 "<<x<<" "<<y<<endl; } void fun(bool x){cout<<"#6 "<<x<<endl; } void fun(char x,char y){cout<<"#7 "<<x<<" "<<y<<endl; }int main(){fun<int,int>(1,2);//通用模板fun<int,char>(1,'a');//通用模板fun<>('a','b');//指定了使用特化版本fun<char,char>fun('a','b');//普通函數(shù)fun(char x,char y),當(dāng)沒有這個普通函數(shù)時調(diào)用完全特化版本fun(3.14,3.14156);//完全特化版本fun(true);//普通函數(shù)fun(bool x)return 0; }程序輸出: #1 1 2 #1 1 a #4 a b #7 a b #5 3.14 3.14156 #6 14 模板特化用于編譯期條件判斷,實例如下: #include <iostream>template<int i> void print() {print<i-1>();std::cout << i << std::endl; }//特例,終止遞歸。 template<> void print<1>() {std::cout << 1 << std::endl; }int main() {print<100>();//在編譯期展開相當(dāng)于100條輸出語句 }程序輸出:
1
2
....
100
總結(jié)
以上是生活随笔為你收集整理的C++模板实战4:模板特化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟化运维中:为什么对网络流量监控这么重
- 下一篇: 生鲜小程序 引领生鲜行业