前几天需要用到这样一种数据结构,如下:
class BaseReg
{
public:
BaseReg(){Datalen=0;}
INT8U Length(){return Datalen;}
protected:
INT8U Datalen;
INT8U Data[8];
};
此结构用于存储寄存器数据,但是数据长度固定,以前8个字节够用了,但是现在长度最多的有20个字节,如何解决此问题。如果将结构中Data数组直接扩展到20字节,会浪费很多空间。一开始想到了用模板,如下:
template<INT8U DATA_LEN>
class BaseReg
{
public:
private:
INT8U Data[DATA_LEN];
INT8U Datalen;
};
这样可以根据不同数据长度定义不同对象如:
BaseReg<4> br4;
BaseReg<6> bt6;
但是BaseReg<4>和BaseReg<6>不是同一类型,不能存入同一个数组中,这样要在各种寄存器中进行搜索就很困难了。于是想到如下解决方案:
class BaseReg
{
public:
BaseReg(){Datalen=0;}
INT8U Length()const{return Datalen;}
virtual void SetData(INT8U* data)=0;
virtual INT8U GetData(INT8U i)const=0;
virtual void PrintData()const=0;
protected:
INT8U Datalen;
};
template<INT8U DATA_LEN>
class TRegData:public BaseReg
{
public:
TRegData()
{
//memset(this,0x00,sizeof(*this));//此行语句将虚函数表指针也置0了,故要注释掉
Datalen=DATA_LEN;
}
void SetData(INT8U* data)
{
memcpy(Data,data,Datalen);
}
INT8U GetData(INT8U i)const
{
return Data[i];
}
virtual void PrintData()const
{
for (INT8U i=0; i<Datalen; ++i)
{
printf("%02X ",Data[i]);
}
printf("/n");
}
private:
INT8U Data[DATA_LEN];
};
于是可以采用如下使用方法:
BaseReg* bg[5];
TRegData<4> tr4;
TRegData<5> tr5;
bg[0]=&tr4;
bg[1]=&tr5;
于是对bg[5]数组进行搜索即可。