通过模板的特化实现 简单的类型萃取 实现memcppy时候对于特殊类型如string类的拷贝。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过模板的特化实现 简单的类型萃取 实现memcppy时候对于特殊类型如string类的拷贝。相关的知识,希望对你有一定的参考价值。
C++怎样识别一个对象的类型? typeid可以获取到一个类型的名称,但是不能拿来做变量的声明。 【POD类型萃取】 // // POD: plain old data 平凡类型(无关痛痒的类型)--基本类型 // 指在C++ 中与 C兼容的类型,可以按照 C 的方式处理。 //#include<iostream> #include<string> using namespace std; struct __TrueType { bool Get() { return true; } }; struct __FalseType { bool Get() { return false; } }; 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<short> { typedef __TrueType __IsPodType; }; template<class T> struct TypeTraits<T*> { typedef __TrueType __IsPodType; }; template<class T> struct TypeTraits<T&> { typedef __TrueType __IsPodType; }; template <class T> void __memcpy(T* dst, T *scr, size_t _size) { cout << "__TrueType" << typeid(T).name() << endl; if (TypeTraits<T>::__IsPodType().Get())//是基本类型 { memcpy(dst, scr, _size*sizeof(T)); } else { for (int i = 0; i < _size; ++i) { dst[i] = scr[i]; } } } template<typename T> class Seqlist { public: Seqlist() :_array(new T[_capcity]), _size(0), _capcity(0) {} void PushBack(const T& x) { update(); _array[_size++] = x; } void update() { if (_size >= _capcity) { _capcity = _capcity * 2 + 3; T* tmp = new T[_capcity]; __memcpy(tmp, _array, _size); delete[]_array; _array = tmp; } } //~Seqlist() //{ // if (_array) // delete[] _array; //} void Print() { for (int i = 0; i < _size; ++i) { cout << _array[i] << " "; } cout << endl; } public: size_t _size; size_t _capcity; T* _array; };
以上是关于通过模板的特化实现 简单的类型萃取 实现memcppy时候对于特殊类型如string类的拷贝。的主要内容,如果未能解决你的问题,请参考以下文章