【C++】模板简述(五):类型萃取

功能

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

 

posted @ 2017-04-18 19:20  C/C++专题  阅读(4207)  评论(0编辑  收藏  举报