916
技術社區[雲棲]
C++―全特化和偏特化
全特化和偏特化
C++中的模板分為類模板和函數模板,雖然它引進到C++標準中的時間不是很長,但是卻得到了廣泛的應用,
這一點在STL中有著充分的體現。目前,STL在C++社區中得到了廣泛的關注、應用和研究。理解和掌握模板
學習、應用和研究以及擴充STL的基礎。而STL模板實例中又充斥著大量的模板特化和偏特化。
模板特化分為兩種:
全特化和偏特化
首先我們得先明白一個問題,為什麼會有特化這種東西呢?
因為編譯器認為,對於特定的類型,如果你能對某一功能更好的實現,那麼就該聽你的。
全特化:
那我們就用一個例子開始吧:
[cpp] view plain copy
-
template<class T>
-
class A
-
{
-
public:
-
A()
-
:a(0)
-
{}
-
~A()
-
{
-
cout << "這裏走了原始的模板"<< endl;
-
}
-
protected:
-
T a;
-
};
-
template<>
-
class A<int>
-
{
-
public:
-
A()
-
:a(0)
-
{}
-
~A()
-
{
-
cout << "這裏走了全特化後int的版本" << endl;
-
}
-
protected:
-
int a;
-
};
-
void test2()
-
{
-
A<char> a;
-
A<int> b;
-
}
我們先看看程序運行的結果:
我們通過析構函數發現了,A<int> b 走的是我們特化的版本。 而A<char> a走的是原始版本。
這就是全特化,我們對模板的所有參數進行了特化。如果你想學習C/C++可以來這個群,首先是三三零,中間是八五九,最後是七六六,裏麵有大量的學習資料可以下載。
下麵是我調試時實例化b的時候,發生的事情,程序走的是int類型特化版本,有圖有真相:
偏特化:
所謂的偏特化也稱局部特化,大家大概明白什麼回事了吧。 全特化是所有的模板參數都被進行特化
,偏特化也就是局部的參數特化,看看下麵這個例子吧:
[cpp]?view plain copy print?
-
template <typename T1, typename T2>
-
class Data
-
{
-
public:
-
Data();
-
private:
-
T1 _d1;
-
T2 _d2;
-
};
-
template <typename T1, typename T2>
-
Data<T1, T2>::Data()
-
{
-
cout << "Data<T1, T2>" << endl;
-
}
-
// 局部特化第二個參數
-
template <typename T1>
-
class Data <T1, int>
-
{
-
public:
-
Data();
-
private:
-
T1 _d1;
-
int _d2;
-
};
-
template <typename T1>
-
Data<T1, int>::Data()
-
{
-
cout << "Data<T1, int>" << endl;
-
}
-
void test2()
-
{
-
Data<double, int> d1;
-
Data<int, double> d2;
-
}
-
int main()
-
{
-
test2();
-
system("pause");
-
return 0;
-
}
我們觀察輸出的結果:
我畫一張圖幫我們理解吧:
下麵我再舉個例子,你們說說他是偏特化還是全特化:
[cpp]?view plain copy print?
-
template <typename T1, typename T2>
-
class Data <T1*, T2*>
-
{
-
public :
-
Data();
-
private :
-
T1 _d1 ;
-
T2 _d2 ;
-
T1* _d3 ;
-
T2* _d4 ;
-
};
-
template <typename T1, typename T2>
-
Data<T1 *, T2*>:: Data()
-
{
-
cout<<"Data<T1*, T2*>" <<endl;
-
}
-
// 局部特化兩個參數為引用
-
template <typename T1, typename T2>
-
class Data <T1&, T2&>
-
{
-
public :
-
Data(const T1& d1, const T2& d2);
-
private :
-
const T1 & _d1;
-
const T2 & _d2;
-
T1* _d3 ;
-
T2* _d4 ;
-
};
-
template <typename T1, typename T2>
-
Data<T1 &, T2&>:: Data(const T1& d1, const T2& d2)
-
: _d1(d1 )
-
, _d2(d2 )
-
{
-
cout<<"Data<T1&, T2&>" <<endl;
-
}
記住這些都是偏特化,這裏就要再引出一個概念,偏特化並不僅僅是指特殊部分參數,而是針對模板參數更
進一步的條件限製所設計出來的一個特化版本。
最後我在說一個注意事項: 模板的全特化和偏特化都是在已經定義的模板基礎之上的,不能單獨存在。
最後更新:2017-05-10 16:31:20