1. 程式人生 > >c++ 模板之特化

c++ 模板之特化

特化

 何為特化,特化也是我們指定一些型別,當我們傳入響應的型別的時候,模板生成的類是我們指定型別所對應的類。
 可能有的時候我們有這樣的需求,普通引數我們走平常的模板類,而對於個別特殊地引數我們需要特殊處理,所以可以走特殊型別對應的模板類,這個時候特化就油然而生了。

全特化

全特化指把所有模板型別特化成確切的型別

1.
template<class T1>
class  A
{
};
template<> //不可省略
class A<int>
{
};
2. 比較騷的全特化用法
template<class T,class T2>
class
B{
}; template <class T> class A{ }; template<class T,class T2> class A<B<T,T2>> { };

偏特化

偏特化幾種方式
1. 特化一部分模板引數
2. 把模板引數覆蓋的範圍變小,比如原來是全模板引數T,現在模板引數範圍變小,可能是T*。

1.
template<class T , class T2>
class A{

};
template<class T>
class A<T, int>
{

};
template
<class T , class T2> class A{ public: void Fun() { cout << "1" << endl; } }; template<class T,class T2> class A<T*, T2*> { public: void Fun() { cout << "2" << endl; } }; int main() { A<int, int> object; object.Fun(); A<int
*, int*> object2; object2.Fun(); return 0; }

對於上面這個程式碼,輸出一個1 一個2。可見只要傳 指標型別,走的是下面這個特化模板類。

特化應用

型別萃取

型別萃取就是通過特化把內建型別和ADT(抽象資料型別即自定義類) 型別,抽離開來。當內建型別我們copy 的時候可以直接調memmove,而ADT則需要傳統的一個個呼叫 operator= 來賦值處理。

struct TrueType
{

};
struct FalseType
{

};
template <class T>
struct IsPoD
{
  typedef  struct FalseType ispod;
};
template<>
struct IsPoD<int>
{
  typedef  struct TrueType ispod;
};
template<>
struct IsPoD<char>
{
   typedef struct TrueType ispod;
};
template<> struct IsPoD<float>
{
   typedef  struct TrueType ispod;
};
template<> struct IsPoD<long>
{
   typedef  struct TrueType ispod;
};