首页 > 代码库 > 类型萃取
类型萃取
在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” 博客,转载请与作者联系!
类型萃取
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。