У меня есть структура, содержащая битовое поле, которое может отличаться по размеру. Пример:Битовые поля с переменным размером с псевдонимом
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