我有一些结构containig位域,其尺寸可变化。 例:
struct BitfieldSmallBase {
uint8_t a:2;
uint8_t b:3;
....
}
struct BitfieldLargeBase {
uint8_t a:4;
uint8_t b:5;
....
}
和工会同时访问所有位:
template<typename T>
union Bitfield
{
T bits;
uint8_t all; // <------------- Here is the problem
bool operator & (Bitfield<T> x) const {
return !!(all & x.all);
}
Bitfield<T> operator + (Bitfield<T> x) const {
Bitfield<T> temp;
temp.all = all + x.all; //works, because I can assume no overflow will happen
return temp;
}
....
}
typedef Bitfield<BitfieldSmallBase> BitfieldSmall;
typedef Bitfield<BitfieldLargeBase> BitfieldLarge;
问题是:对于一些位域的基类,一个uint8_t是不够的。 BitfieldSmall不适合一个uint8_t,但BitfieldLarge没有。 这些数据需要(这将SSE指令后处理)被包装尽可能紧,所以总是使用uint16_t是毫无疑问的。 是否有与整型,其大小是一样的位域申报“所有”字段的方法吗? 或者另一种方式来访问位作为一个整体?
当然,我可以放弃使用模板,并明确申报各种位域的,但我想,以避免重复代码(有运营商UND成员函数相当的列表)。