c++模板特化偏特化


模板為什么要特化,因為編譯器認為,對於特定的類型,如果你對某一功能有更好地實現,那么就該聽你的。

模板分為類模板與函數模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體類型,偏特化就是模板如果有多個類型,那么就只限定為其中的

一部分,其實特化細分為范圍上的偏特化與個數上的偏特化。

模板的泛化:是指用的時候指定類型。

 

 

上面的方框內的內容是指模板的泛化,下面的方框內的內容是指模板的特化。特化的優先級比泛化的優先級高。

 

 

模板的偏(范圍)特化是指個數,范圍上的偏特化

 

 

個數上的偏特化,從左到右

測試代碼如下:

#include <iostream>
using namespace std;
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;
    int b;
};
template<typename T2> //由於只指定了一部分參數,剩下的未指定的需在參數列表中,否則報錯。
class Test<char,T2>{
public:
    Test(char i,T2 j):a(j),b(j){cout<<"個數偏特化"<<endl;}
private:
    char a;
    T2 b;
};
template<typename T1,typename T2> //這是范圍上的偏特化
class Test<T1*,T2*>{
public:
    Test(T1* i,T2* j):a(i),b(j){cout<<"指針偏特化"<<endl;}
private:
    T1* a;
    T2* b;
};
template<typename T1,typename T2>//同理這也是范圍上的偏特化
class Test<T1 const,T2 const>{
public:
    Test(T1 i,T2 j):a(i),b(j){cout<<"const偏特化"<<endl;}
private:
    T1 a;
    T2 b;
};
 
        
 
        
int main()
{
    int a;
    Test<double,double> t1(0.1,0.2);
    Test<int,char> t2(1,'A');
    Test<char,bool> t3('A',true);
    Test<int*,int*> t4(&a,&a);
    Test<const int,const int> t5(1,2);
    return 0;
}

 運行結果截圖:

 

而對於函數模板,卻只有全特化,不能偏特化:

#include <iostream>
using namespace std;
//模板函數
template<typename T1,typename T2>
void fun(T1 a,T2 b){
    cout<<"模板函數"<<endl;
}
//全特化
template<>
void fun(int a,char b){
    cout<<"全特化"<<endl;
}
//函數不存在偏特化,以下代碼是錯誤的
/*
template<typename T2>
void fun(char a,T2 b){
    cout<<"偏特化"<<ednl;
}
*/
int main()
{
    int a=0;
    char b='A';
    fun(a,a);
    fun(a,b);
    return 0;
}
運行截圖如下:

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM