类型萃取: 区分T是什么类型。(因为有时候内置类型和自定义类型执行的代码可能不同(比如内置类型的代码,自定义类型不可用.自定义类型的代码,内置和自定义类型都可以用
这时我们不可能为每种类型专门特化出来一个版本去写代码, 或者两种类型都使用自定义类型的代码。 如果我们能:区分T的类型,让自定义类型执行自定义类型代码,让内置类型,执行内置类型代码。 那么情况就会好很多。 因此我们提出了类型萃取).
呐,我们的头文件就是这样, 需要区分 T 类型的地方包含了这个头文件后 接下来我们这样做, 就可以区分 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
{
自定义类型代码
}