码迷,mamicode.com
首页 > 其他好文 > 详细

通过模板的特化实现 简单的类型萃取 实现memcppy时候对于特殊类型如string类的拷贝。

时间:2016-03-16 19:30:18      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:c++ 类型萃取 顺序表

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类的拷贝。

标签:c++ 类型萃取 顺序表

原文地址:http://10955910.blog.51cto.com/10945910/1751730

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!