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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模板类的全特化、偏特化

發布時間:2024/1/17 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模板类的全特化、偏特化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們先來定義一個普通的模板類

1 template<class T> 2 struct Test 3 { 4 Test(){ cout << "模板類" << endl; } 5 };

我們再來調用一下:

1 int main() 2 { 3 Test<char> t1; 4 Test<int> t2; 5 Test<int *> t3; 6 return 0; 7 }

輸出的結果1:

  模板類

  模板類

  模板類

如果我們這樣寫,再增加一個模板類

1 template<class T> 2 struct Test 3 { 4 Test(){ cout << "模板類" << endl; } 5 }; 6 7 template<> 8 struct Test<int> 9 { 10 Test(){ cout << "全特化" << endl; } 11 };

再來調用一下,調用代碼同上!

輸出的結果2:

  模板類

  全特化

  模板類

其中template<>開頭的模板類就是全特化的模板類,根據全特化模板的定義就知道,全特化的時候沒有類型參數,即template<(這里是空)>。由于全特化版本的模板類與Test<int> t2;調用時更接近,所以會用這個模板來實例化一個類。

那什么是偏特化模板類,先看如下定義:

1 template<class T> 2 struct Test 3 { 4 Test(){ cout << "模板類" << endl; } 5 }; 6 7 template<> 8 struct Test<int> 9 { 10 Test(){ cout << "全特化" << endl; } 11 }; 12 13 template<class T> 14 struct Test<T*> 15 { 16 Test(){ cout << "偏特化" << endl;} 17 };

再次調用,輸出結果3:

  模板類
  全特化
  偏特化 

我們看一下,第三個模板類的定義,會發現它很特別,它既有類型參數。但又需要對其進行特化(這里是特化成指針類型),當你給的是指針類型的時候,會調用這個模板,而不是普通模板。這就是部分特化,也稱偏特化。有的人可能會想到,我這樣寫不也行么:

template<class T*> struct Test {Test(){ cout << "型別是指針!" << endl;} };

對不起,這段代碼可以通過編譯,但是在你實例化一個類的時候,即Test<int *> t;的時候就編譯不同過了!所以必須要用到偏特化!當然,我上面寫的是偏特化的一種,當這樣的時候也是偏特化:

template<class T> struct Test<int,T> { }

這個偏特化的例子中,一個參數被綁定到int類型,而另一個參數仍未綁定需要由用戶指定。這也是偏特化。而且更好理解!還有一點要注意的是,我們在寫全特化類模板和偏特化類模板的時候,都必須給出一個普通類模板的定義,如果不定義普通模板而只定義全特化模板或者偏特化模板編譯時會報錯:對不起,XXX不是一個模板!

?

?

?

轉載于:https://www.cnblogs.com/zhuwbox/p/3694860.html

總結

以上是生活随笔為你收集整理的模板类的全特化、偏特化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。