模板——类型萃取
类型萃取,在STL中用到的比较多,用于判断一个变量是否为POD类型(平凡类型)。
简单来说可以用来判断出某个变量是内置类型还是自定义类型。
通过类型萃取,萃取到变量类型,对不同变量进行不同处理,以提升程序的效率。
应用场景:
在拷贝对象时,对于内置类型我们用memcpy来进行赋值(
浅拷贝相关的类也可以通过memcpy赋值
)。
对于自定义类型,且大多数深拷贝的对象来说,我们必须通过调用for循环赋值语句来赋值.
我们如果可以判断出它是POD类型或者非POD类型的话。这样,
对于POD类型用memcpy函数,对于非POD用赋值,这样就能提高程序的效率。
下面我用图来解释一下推演的过程:
代码如下:
#include<string> using namespace std; struct __TrueType {}; struct __FalseType {}; template<class T> struct __TypeTraits { typedef __FalseType IsPODType; }; template<> struct __TypeTraits<int> { typedef __TrueType IsPODType; }; template<> struct __TypeTraits<char> { typedef __TrueType IsPODType; }; template<> struct __TypeTraits<double> { typedef __TrueType IsPODType; }; template<class T> T* __TypeCopy(T* dst, const T* src, size_t n, __TrueType) { cout << "memcpy" << endl; return (T*)memcpy(dst, src, n*sizeof(T)); } template<class T> T* __TypeCopy(T* dst, const T* src, size_t n, __FalseType) { cout << "operator=" << endl; for (size_t i = 0; i < n; i++) { dst[i] = src[i]; } return dst; } template<class T> T* TypeCopy(T* dst, const T* src, size_t n) { return __TypeCopy(dst, src, n, __TypeTraits<T>::IsPODType()); } //测试 void TestTypeTraits() { int a1[3] = { 1, 2, 3 }; int a2[3] = { 0, 0, 0 }; TypeCopy(a1, a2, 3); string s1[] = { "11", "22", "33" }; string s2[] = { "0", "0", "0" }; TypeCopy(s1, s2, 3); char c1[3] = { 'a' ,'b', 'c'}; char c2[3] = { 'x', 'y', 'z' }; TypeCopy(c1, c2, 3); double d1[3] = { 1.0, 2.0, 3.0 }; double d2[3] = { 0.0, 0.0, 0.0 }; TypeCopy(d1, d2, 3); }