功能
类型萃取,在STL中用到的比较多,用于判断一个变量是否为POD类型.
简述来说可以用来判断出某个变量是内置类型还是自定义类型.
通过类型萃取,萃取到变量类型,对不同变量进行不同处理,可以提升程序效率.
应用场景
比如我们实现顺序表,在对顺序表进行扩容时,就靠重新开辟内存、拷贝对象.
拷贝对象时,就有两种情况:一种是类型,比如int char...;还有一种是自定义类型,Data类、String类.
对于内置类型,我们可以通过memset,来进行赋值.(扩展,浅拷贝相关的类也可以通过memset赋值)
而对于自定义类型,大多数深拷贝的对象来说,我们必须通过调用赋值语句来赋值.
因此,我们通常在拷贝对象时,为了不出现错误,都用赋值语句来赋值.
而我们如果有一种方法/机制可以判断POD类型或者非POD类型.
对于POD类型用memset函数,对于非POD用赋值,这样就能提高程序的效率
实现
类型萃取,在技术层面,就是利用了模板的特化.
简单类型萃取的实现代码:
template<typename T> struct TypeTraits{ static bool IsPODType(){ return false; } }; //特化int template<> struct TypeTraits<int>{ static bool IsPODType(){ return true; } }; //特化unsigned int template<> struct TypeTraits<unsigned int>{ static bool IsPODType(){ return true; } }; template<> struct TypeTraits<char>{ static bool IsPODType(){ return true; } }; template<> struct TypeTraits<unsigned char>{ static bool IsPODType(){ return true; } }; template<> struct TypeTraits<short>{ static bool IsPODType(){ return true; } }; template<> struct TypeTraits<unsigned short>{ static bool IsPODType(){ return true; } }; //.....更多类型,继续特化就好
测试代码:
#include<iostream> template<typename T> void CheckTypeTraits(T &v){ std::cout<<v<<"是POD类型?"<<TypeTraits<T>::IsPODType()<<std::endl; } int main(){ int a = 1; char b = '2'; short c = 3; float d = 4.4; //没有特化处理,因此返回0 CheckTypeTraits(a); CheckTypeTraits(b); CheckTypeTraits(c); CheckTypeTraits(d); return 0; }