我有一些struct 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是無可爭議的。有沒有辦法用整數類型聲明「全部」字段,其大小與位域相同?或者另一種方式來訪問整體?
我當然可以放棄模板的使用並明確聲明每種位域,但是我想避免代碼重複(這裏有相當多的操作符和成員函數)。
有時溶液是如此簡單:-) – hirschhornsalz 2009-10-01 12:06:40