(函数/类模板)的(偏特化/全特化)
特化的概念
特化,就是將泛型的東東搞得“具體化”一些,從字面上來解釋,就是為已有的模板參數(shù)進(jìn)行一些使其特殊化的指定,使得以前不受任何約束的模板參數(shù),或受到特定的修飾或完全被指定了下來。
模板特化的分類
(1)針對特化的對象不同,分為兩類:函數(shù)模板的特化和類模板的特化
全特化的標(biāo)志:template <>然后是完全和模板類型沒有一點關(guān)系的類實現(xiàn)或者函數(shù)定義。
全特化就是限定死模板實現(xiàn)的具體類型;
偏特化就是如果這個模板有多個類型,那么只限定其中的一部分。
全特化的標(biāo)志:template <>
偏特化的標(biāo)志:template <… …>
【說明】<>中寫的是沒有被特化的類型,舉例子說明:
①如果<>里邊是空的,則說明每個類型都被特化,因此就是全特化。
②如果<… …>里邊不是空的,則… …就是沒有被特化的類型
【注】
①模板函數(shù)只能全特化,沒有偏特化(以后可能有);模板類是可以全特化和偏特化的。②全特化也就是定義了一個全新的類型,針對于類的全特化,“類中的函數(shù)”可以與模板類不一樣,也就是說生成了一個全新的類。
(2)針對特化的范圍不同,分為兩類:全特化和偏特化
偏特化:就是模板中的模板參數(shù)沒有被全部確定,有部分參數(shù)類型需要編譯器在編譯時進(jìn)行確定。
例1:函數(shù)模板的全特化
template <class T> //函數(shù)模板 int compare(const T &left, const T&right) {std::cout <<"in template<class T>..." <<std::endl;return (left - right); }//函數(shù)模板的全特化代碼見下面兩種情況,一共有兩種寫法(這兩種寫法等價!): //寫法一 template < > int compare<const char*>(const char* left, const char* right) {std::cout <<"in special template< >..." <<std::endl;return strcmp(left, right); } //寫法二 template < > int compare(const char* left, const char* right) {std::cout <<"in special template< >..." <<std::endl;return strcmp(left, right); }例2:類模板的偏特化
#include <iostream> #include <cstring> #include <cmath> //類模板T template<class T> class Compare { public:static bool IsEqual(const T& lh, const T& rh){std::cout <<"in the general class..." <<std::endl;return lh == rh;} }; //類模板的全特化float template<> class Compare<float> { public:static bool IsEqual(const float& lh, const float& rh){std::cout <<"in the float special class..." <<std::endl;return std::abs(lh - rh) < 10e-3;} }; //類模板的全特化double template<> class Compare<double> { public:static bool IsEqual(const double& lh, const double& rh){std::cout <<"in the double special class..." <<std::endl;return std::abs(lh - rh) < 10e-6;} }; 【注】調(diào)用準(zhǔn)則:先去全特化、偏特化中尋找匹配的函數(shù);若找不到再去模板函數(shù)中去尋找。 int main(void) {Compare<int> comp1;std::cout <<comp1.IsEqual(3, 4) <<std::endl;std::cout <<comp1.IsEqual(3, 3) <<std::endl;Compare<float> comp2;std::cout <<comp2.IsEqual(3.14, 4.14) <<std::endl;std::cout <<comp2.IsEqual(3, 3) <<std::endl;Compare<double> comp3;std::cout <<comp3.IsEqual(3.14159, 4.14159) <<std::endl;std::cout <<comp3.IsEqual(3.14159, 3.14159) <<std::endl;return 0; }例3:類模板的偏特化
//類模板T1、T2 template<class T1, class T2> class A { } //類模板的偏特化T1, int template<class T1> class A<T1, int> { }【綜合示例】
template<typename T1, typename T2> class Test { public: Test(T1 i,T2 j):a(i),b(j){cout<<"模板類"<<endl;} private: T1 a; T2 b; }; template<> class Test<int , char> { public: Test(int i, char j):a(i),b(j){cout<<"全特化"<<endl;} private: int a; char b; }; template <typename T2> class Test<char, T2> { public: Test(char i, T2 j):a(i),b(j){cout<<"偏特化"<<endl;} private: char a; T2 b; }; //那么下面3句依次調(diào)用類模板、全特化與偏特化: Test<double , double> t1(0.1,0.2); Test<int , char> t2(1,'A'); Test<char, bool> t3('A',true);例4:函數(shù)模板的偏特化
而對于函數(shù)模板:只有全特化,不能偏特化! //模板函數(shù) template<typename T1, typename T2> void fun(T1 a , T2 b) {cout<<"模板函數(shù)"<<endl; }//全特化 template<> void fun<int ,char >(int a, char b) {cout<<"全特化"<<endl; }//函數(shù)不存在偏特化:下面的代碼是錯誤的 /* template<typename T2> void fun<char,T2>(char a, T2 b) {cout<<"偏特化"<<endl; } */ 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的(函数/类模板)的(偏特化/全特化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: if (argc == 1) 到底有什么
- 下一篇: vector/list/map/set的