功能
类型萃取,在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;
}