【 코드 】 템 플 릿 동적 선형 표 & 유형 추출

3508 단어 선형 표템 플 릿
선형 표 라 는 데이터 구조 가 템 플 릿 으로 완 성 될 때 사용자 정의 형식 (여기 서 깊이 있 는 복사 형식 이 존재 할 때 string) 이 나타 나 면 이 템 플 릿 의 할당 연산 자 재 업로드 와 복사 구조 에 BUG 가 나타 날 수 있 습 니 다. 이런 BUG 는 같은 주 소 를 두 번 분석 한 데 서 비롯 된 것 입 니 다.이 문 제 를 해결 하기 위해 서 우 리 는 유형 추출 을 할 수 있 습 니 다. 우리 가 얻 은 것 이 깊이 복사 와 관련 이 없 는 선형 표 일 때 우 리 는 일반적인 memcpy 를 호출 하여 복 제 를 완성 할 수 있 습 니 다. 만약 에 깊이 복사 와 관련 이 있다 면 우 리 는 사용자 정의 형식 으로 다시 불 러 온 할당 연산 자 를 사용 하여 값 을 부여 할 수 있 습 니 다. 그 코드 는 다음 과 같 습 니 다.
    
#pragma once
#include<iostream>
#include<string>
struct __TrueType//                   
{
	bool Get()
	{
		return true;
	}
};

struct __FalseType
{
	bool Get()
	{
		return false;
	}
};

template <class _Tp>
struct TypeTraits
{
	typedef __FalseType   __IsPODType;
};

template <>
struct TypeTraits< bool>
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< char>
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< unsigned char >
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< short>
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< unsigned short >
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< int>
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< unsigned int >
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< long>
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< unsigned long >
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< long long >
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< unsigned long long>
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< float>
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< double>
{
	typedef __TrueType     __IsPODType;
};

template <>
struct TypeTraits< long double >
{
	typedef __TrueType     __IsPODType;
};

template <class _Tp>
struct TypeTraits< _Tp*>
{
	typedef __TrueType     __IsPODType;
};

template <class T>//      
class SeqList
{
public:
	SeqList()
		:_size(0),
		_capacity(10),
		_array(new T[_capacity])
	{
		memset(_array,0,sizeof(T)*_capacity);
	}
	SeqList(const T &x)
		:_size(1),
		_capacity(10),
		_array(new T[_capacity])
	{
		_array[0] = x;
	}
	SeqList(const SeqList & x)
	{
		_array = new T[x._size];
		my_memcpy(_array, x._array, sizeof(T)*x._size);//         
		_capacity = x._size;
		_size = _capacity;
	}
	void PushBack(const T & x)
	{
		_CheckCapacity();
		_array[_size++] = x;
	}
	SeqList & operator = (SeqList  l)
	{
		swap(_array, l._array);
		swap(_size, l._size);
		swap(_capacity, l._capacity);
		return *this;
	}

	~SeqList()
	{
		if (_array)
		{
			delete[] _array;
		}
	}
private:
	void _CheckCapacity()
	{
		if (_size >= _capacity)
		{
			_capacity *= 3;
			T * tmp = new T [_capacity];
			memcpy(tmp, _array, sizeof(T)*_capacity);
			delete[] _array;
			_array = tmp;
		}
	}
	void my_memcpy(T* dst, const T* src, size_t size)
	{
		if (TypeTraits <T>::__IsPODType().Get())//               
		{
			memcpy(dst, src, size*sizeof (T));
		}
		else//            
		{
			for (size_t i = 0; i < size; ++i)
			{
				dst[i] = src[i];
			}
		}
	}
	size_t _size;
	size_t _capacity;
	T *_array;
};

    만약 부족 하 다 면 지적 하여 바로잡아 줄 희망 이 있다

좋은 웹페이지 즐겨찾기