サイズが異なる可能性があるビットフィールドを含む構造体がいくつかあります。例:
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 を使用することは問題外です。サイズがビットフィールドと同じ整数型で「all」フィールドを宣言する方法はありますか? または、ビット全体にアクセスする別の方法はありますか?
もちろん、テンプレートの使用を控えて、あらゆる種類のビットフィールドを明示的に宣言することもできますが、コードの繰り返しは避けたいと思います (演算子とメンバー関数のかなりのリストがあります)。