日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++模板实战4:模板特化

發(fā)布時(shí)間:2024/3/26 c/c++ 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++模板实战4:模板特化 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ?模板設(shè)計(jì)的目的就是為了通用,但是某些情形下也有特殊情形獨(dú)立于通用規(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)用逗號隔開的項(xiàng)目列表,如前面的<int,char>,且項(xiàng)目數(shù)目必須和通用模板參數(shù)個(gè)數(shù)一致,也就是這里通用模板參數(shù)是T、N,所以特化時(shí)不能類似于show<int>

? 3) 匹配式中各項(xiàng)目類型須與通用模板參數(shù)類型一致

? 4) 匹配式項(xiàng)目可以是具體的模板參數(shù)值,也可以是特化成具體的類型

? 5) 當(dāng)匹配式項(xiàng)目是類型模板參數(shù)時(shí),與函數(shù)變量類似,模板參數(shù)也可以用*、&、const、volatile等修飾

? ?實(shí)例如下:

//用于模板型模板參數(shù)的模板 template<typename T, int i> struct S1;//模板通例,有三個(gè)模板參數(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í)例作為類型參數(shù)值。匹配S<S1<任意類型, 10>, 10, S1> template<typename T> struct S<S1<T, 10>, 10, S1>;//特例5,錯(cuò)誤!匹配式項(xiàng)目數(shù)與通例參數(shù)數(shù)不一致 // template<typename T, int i, template<typename, int> class SP, typename TT> // struct S<T, i, SP, TT>;//特例6,錯(cuò)誤!匹配式項(xiàng)目類型與通例參數(shù)類型不同 // template<typename T> // struct S<char, 10, T>;//特例7,錯(cuò)誤!模板型參數(shù)SP與通例中SP類型不一致 // template<typename T, int i, template<typename> class SP> // struct S<const T, i, SP>;
2 ?類模板匹配按照 最佳匹配原則進(jìn)行匹配,實(shí)例如下:

#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ù)類似,但是模板實(shí)例化代碼是編譯器在編譯期展開的所以是內(nèi)聯(lián)的。多個(gè)模板實(shí)例或用相同類型的普通函數(shù)混合在一起的時(shí)候函數(shù)的匹配規(guī)則如下:

?1) 最佳匹配原則,按照實(shí)參和形參的匹配程度最優(yōu)選擇

?2) 普通函數(shù)優(yōu)先于模板實(shí)例

?3) 模板實(shí)例間特化程度高的優(yōu)先級高

? 實(shí)例如下:

#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)沒有這個(gè)普通函數(shù)時(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 1
4 模板特化用于編譯期條件判斷,實(shí)例如下:

#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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。