类型萃取

类型萃取:  区分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

{

自定义类型代码

}



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