|
|
我是希望把一个基本数据类型拆成两部分,分别存取A、B两种数据,
当这个数据类型大于等于32位的时候,第一部分(Left)取 1/4,第二部分(Right)取3/4。
当这个数据类型大于等于8位小于32位的时候,第一部分保证取8位,剩余的为第二部分。
使用方式是
ChannelLength<long>: eft(值为8)
ChannelLength<long>::Right(值为24)
ChannelLength<__int64>::Left(值为16)
ChannelLength<__int64>::Right(值为48)
ChannelLength<char>::Left(值为8)
ChannelLength<char>::Right(值为0)
在我的代码中的作用是避免了硬编码,并且为以后移植64位机器做好了准备,对运行其效率也没有任何影响。
用模板实现了编译期的代码。
下面是代码:)
template<class T,int I = (sizeof(T)>>2)>
class ChannelLength
{
public:
enum
{
Left = (I<<3),
Right = (sizeof(T) - I)<<3,
Length = Left + Right
};
};
//当数据位数小于32时候执行下面代码
template<class T>
class ChannelLength<T, 0>
{
public:
enum
{
Left = 8,
Right = (sizeof(T) - 1)<<3,
Length = Left + Right
};
};
还有一个好玩的事情,以前一直没注意。
这阵子一直喜欢写递归的模板,有一写错没有执行到递归结束的条件,结果编译器(VS2005)一直运行编译,也不会有错误出现。自己等了老长时间。最后发现问题强制结束了编译。
看样子,VC2005支持模板递归的层级还真不少。运行那么长时间还不溢出。 |
|