c++ 模板之特化
阿新 • • 發佈:2019-01-28
特化
何為特化,特化也是我們指定一些型別,當我們傳入響應的型別的時候,模板生成的類是我們指定型別所對應的類。
可能有的時候我們有這樣的需求,普通引數我們走平常的模板類,而對於個別特殊地引數我們需要特殊處理,所以可以走特殊型別對應的模板類,這個時候特化就油然而生了。
全特化
全特化指把所有模板型別特化成確切的型別
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;
};