這時我們不可能爲每種類型專門特化出來一個版本去寫代碼, 或者兩種類型都使用自定義類型的代碼。 如果我們能:區分T的類型,讓自定義類型執行自定義類型代碼,讓內置類型,執行內置類型代碼。 那麼情況就會好很多。 因此我們提出了類型萃取).
首先,在我們需要區分 T 是什麼類型 的地方,包含:TypeTraits.h頭文件:
struct __TrueType
{
bool Get( )
{
return true;
}
};
struct __FlaseType
{
bool Get( )
{
return false;
}
};
template<class T>
struct TypeTraits //爲什麼空類(沒有成員變量)對象大小1? 必須佔個位?
{
//Pod 無關痛癢的類型——內置類型,原生類型
typedef __FlaseType IsPodType;
}
template<> //特化版本
struct TypeTraits<int> //可以把所以的內置類型都寫一下
{
typedef __TrueType IsPodType;
}
template<class T> //把c語言中除struct定義的外,別的都當作內置類型, ptr也是一個內置類型。 原生指針又沒有析構函數。
struct TypeTraits<T*>
{
typedef __TrueType IsPodType;
}
吶,我們的頭文件就是這樣, 需要區分 T 類型的地方包含了這個頭文件後 接下來我們這樣做, 就可以區分 T 的類型:
TypeTraits<T>::IsPodType()/*括號(默認構造函數,生成一個對象)*/.Get()//調用這個方法
//必須是struct 否則,class私有成員無法訪問,或者class改爲public
將 T 傳進來,如果 T 是我們以上寫的特化版本(內置類型) , 如 int, char等 就調用__TrueType類的.Get( )方法,返回true.
如果是非內置類型,就返回false.
很多時候, 內置類型和自定義類型的處理代碼都不同, 比如考慮到拷貝的時候,深淺拷貝, 內置類型和自定義類型的處理代碼 , 可能就不同。
我們可以這樣使用類型萃取區分 T 類型:
比如我們的代碼對 自定義類型 和 內置類型 分別 執行兩種代碼, 可以如下處理:
if ( true == TypeTraits<T>::IsPod( ).Get( ) )
{
內置類型代碼;
}
else
{
自定義類型代碼
}