这里放上一个数组模板,主要是封装了一下[]运算符,=运算符的重载,来提供对数组的操作,把一个数组当成一个对象处理
其他功能函数,诸如拷贝构造之类,暂时就不写了,需要的可以加上。
数组长度作为模板参数传入。
这里处理了一下长度参数的合法性问题,对于负数,或者比较大的正数,默认生成为长度为1的数组。
参考模板 能否按区间 进行特化,采用了8楼提供的方式,在此感谢
7.10修改,数组模板继承之前的容器类基类
上代码
TArray.h:
#ifndef _TArray_h_
#define _TArray_h_
#include <windows.h>
#include "TContainer.h"
const unsigned int MAX_ARRAY_LEN = 0xffff;
//1维数组模板
template <class T, unsigned int len>
class TArray1 : public TContainer<T>
{
public:
TArray1();
virtual ~TArray1();
void Init(ContainerFlag dwLock = enum_EnableLock);
T *GetHead();
T *GetNext(T *curr);
void *GetNode(T *curr);
TArray1<T, len>& operator= (const TArray1<T, len>& temp);
T& operator[] (unsigned int index);
private:
T m_array[(0 < len && len <= MAX_ARRAY_LEN) ? len : 1];
unsigned __int64 m_HeadAddr;
unsigned __int64 m_TailAddr;
};
#include "TArray.hpp"
#endif
TArray.hpp:
#ifndef _TArray_hpp_
#define _TArray_hpp_
template <class T, unsigned int len>
TArray1<T, len>::TArray1()
{
Init();
}
template <class T, unsigned int len>
TArray1<T, len>::~TArray1()
{
}
template <class T, unsigned int len>
void TArray1<T, len>::Init(ContainerFlag dwLock)
{
m_dwLen = (0 < len && len <= MAX_ARRAY_LEN) ? len : 1;
m_dwLock = dwLock;
m_HeadAddr = reinterpret_cast<unsigned __int64>(&(m_array[0]));
m_TailAddr = reinterpret_cast<unsigned __int64>(&(m_array[m_dwLen - 1]));
}
template <class T, unsigned int len>
T *TArray1<T, len>::GetHead()
{
return &(m_array[0]);
}
template <class T, unsigned int len>
T *TArray1<T, len>::GetNext(T *curr)
{
unsigned __int64 currAddr = reinterpret_cast<unsigned __int64>(curr);
if (m_HeadAddr <= currAddr && currAddr <= m_TailAddr)
{
unsigned __int64 addr = m_TailAddr - currAddr;
if (addr % sizeof(T) == 0)
{
if (addr >= sizeof(T))
{
return curr + 1;
}
else
{
return NULL;
}
}
}
return &(m_array[0]);
}
template <class T, unsigned int len>
void *TArray1<T, len>::GetNode(T *curr)
{
unsigned __int64 currAddr = reinterpret_cast<unsigned __int64>(curr);
if (m_HeadAddr <= currAddr && currAddr <= m_TailAddr)
{
unsigned __int64 addr = m_TailAddr - currAddr;
if (addr % sizeof(T) == 0)
{
return curr;
}
}
return &(m_array[0]);
}
template <class T, unsigned int len>
T& TArray1<T, len>::operator[] (unsigned int index)
{
if (index < m_dwLen)
{
return m_array[index];
}
else
{
return m_array[0];
}
}
template <class T, unsigned int len>
TArray1<T, len>& TArray1<T, len>::operator= (const TArray1<T, len>& temp)
{
for (unsigned int i = 0; i < m_dwLen; i++)
{
m_array[i] = temp.m_array[i];
}
return *this;
}
#endif