您的位置:首页 > 编程语言

类型萃取

2017-04-21 12:19 190 查看
类型萃取:  区分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

{

自定义类型代码

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息