C++类型萃取

C++模板中的类型参数T是抽象的,我们并不能在模板内部直接获得它的具体特征。类型萃取(抽取)技术就是要抽取类型的一些具体特征(trait),比如它是哪种具体类型,它是引用类型,内建类型,还是类类型等。可见,类型萃取技术其实就是trait模板技术的具体体现。获取类型的具体特征在Java、C#等语言中也称为反射(reflection),C++中通过模板技术也可以实现一定的反射行为。
   类型信息是编译期的实体,现在要针对类型来进行编程,这其实就是模板元编程的一个方面。我们平常使用的if/else,while,for等基本的逻辑结构都是运行期的行为,在面向类型的编程中并不能使用,这就需要用到一些特殊的模板技术。实现类型萃取要用到的基本思想一个是特化,一个就是用typedef来携带类型信息。实际上,我们在用模板做设计时,一般建议在模板定义内部,为模板的每个类型参数提供typedef定义,这样在泛型代码中可以很容易地访问或抽取这些类型。
   在C和C++中,普通的函数可以称为值函数,它们接受的参数是某些值,返回的结果也是值。而所谓的类型函数接受的实参是类型,返回的是被抽取出来的类型或常量值等(即用typedef定义的类型别名,一般不同的具体类型都定义统一的别名)。如类模板就是类型函数,sizeof是内建的类型函数,返回给定类型实参的大小。在类型编程中,很多地方都要用到sizeof。



#define _CRT_SECURE_NO_WARNINGS 1



//typeid可以获取一个类型的名称,但是不能拿来做变量的声明


//POD类型萃取
//平凡类型(无关痛痒的类型)——基本类型
//在C++和C兼容的类型,可以按照C的处理方式


#include<iostream>
#include<stdlib.h>
using namespace std;


struct __TrueType
{
bool Get()
{
return true;
}
};


struct __FalseType
{
bool Get()
{
return false;
}
};


template<class _Tp>
struct TypeTraits
{
typedef __FalseType  __IsPODType;
};


template<>
struct TypeTraits<bool>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<char>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<unsigned char>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<short>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<unsigned short>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<int>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<unsigned int>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<long>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<unsigned long>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<long long>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<unsigned long long>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<float>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<double>
{
typedef __TrueType  __IsPODType;
};


template<>
struct TypeTraits<long double>
{
typedef __TrueType  __IsPODType;
};


template<class _Tp>
struct TypeTraits<_Tp*>
{
typedef __TrueType  __IsPODType;
};


//使用参数推的萃取处理


template<class T>
void Copy(const T* src, T*dst, size_t size, __FalseType)
{
cout << "__FalseType:" << typeid(T).name() << endl;
for (size_t i = 0; i < size; ++i)
{
dst[i] = src[i];
}
}


template<class T>
void Copy(const T* src, T*dst, size_t size, __TrueType)
{
cout << "__TrueType:" << typeid(T).name() << endl;
memcpy(dst, src, size*sizeof(T));
}


//使用萃取类型判断类型的Get函数判断是否是POD类型来处理


template<class T>
void Copy(const T* src, T*dst, size_t size)
{
cout << "__TrueType:" << typeid(T).name() << endl;
if (TypeTraits<T>::__IsPODType().Get())
{
memcpy(dst, src, size*sizeof(T));
}
else
{
for (size_t i = 0; i < size; ++i)
{
dst[i] = src[i];
}
}
}
void Test()
{
string s1[10] = { "1", "2", "3", "444444444444444444444444" };
string s2[10] = { "11", "22", "33" };
Copy(s1, s2, 10, TypeTraits<string>::__IsPODType());
Copy(s1, s2, 10);


int a1[10] = { 1, 2, 3 };
int a2[10] = { 0 };
Copy(a1, a2, 10, TypeTraits<int>::__IsPODType());
Copy(a1, a2, 10);
}


int main()
{
Test();
system("pause");
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值