类型萃取
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类型萃取相关的知识,希望对你有一定的参考价值。
在C++中我们可以通过typeid来获取一个类型的名称(内置类型和自定义类型都可以),但是我们不能用这种方式获取来的名称做变量的声明。那么在C++中怎样识别对象的类型呢??我们可以通过类型萃取的方式来区分内置类型和自定义类型。
例如:我们在Seqlist中要用到类型萃取,因为内置类型我们可以通过memcopy和memmove这两个方式进行拷贝,自定义类型或string我们要通过赋值的方式拷贝。这样的话会提高效率。
类型萃取的方式:类型萃取是在模板的基础上区分内置类型和其他类型,主要原理是将内置类型全部特化,然后再进行区分。
struct TrueType { bool Get() { return true; } }; struct FalseType { bool Get() { return false; } }; template<typename T> struct TypeTraits { typedef FalseType IsPODType; //如果不是内置类型,则IsPODType是FalseType }; //将所有内置类型特化 template<> struct TypeTraits<int> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<unsigned int> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<short> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<unsigned short> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<char> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<unsigned char> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<float> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<double> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<long> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<long double> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<unsigned long> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<long long> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<> struct TypeTraits<unsigned long long> { typedef TrueType IsPODType; //如果是内置类型则IsPODType是TrueType }; template<typename T> void Copy(T* dest,T* src,int sz) { if (TypeTraits<string>::IsPODType().Get() == 1)//如果是内置类型 { memmove(dest, src, sz*sizeof(T)); //对于string存在浅拷贝的问题,所以string必须用值拷贝 } else //如果不是内置类型 { for (int i = 0; i < sz; i++) { dest[i] = src[i]; } } }
本文出自 “11132019” 博客,转载请与作者联系!
以上是关于类型萃取的主要内容,如果未能解决你的问题,请参考以下文章