類型萃取

類型萃取:  區分T是什麼類型。(因爲有時候內置類型和自定義類型執行的代碼可能不同(比如內置類型的代碼,自定義類型不可用.自定義類型的代碼,內置和自定義類型都可以用
這時我們不可能爲每種類型專門特化出來一個版本去寫代碼,  或者兩種類型都使用自定義類型的代碼。  如果我們能:區分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

{

自定義類型代碼

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章