Вы должны попытаться использовать c ++ bitfield , он должен делать именно то, что вы хотите, и избегать дублирования данных. Вы можете реализовать это так, например:
struct data8_t
{
template <typename T>
void operator=(T rhs) {
data = (uint8_t)rhs;
}
union
{
uint8_t data;
struct {
uint8_t b0 : 1,
b1 : 1,
b2 : 1,
b3 : 1,
b4 : 1,
b5 : 1,
b6 : 1,
b7 : 1;
};
};
};
Используйте это так:
int main()
{
data8_t b;
for(int i = 0; i < 15; i++)
{
b = i;
std::cout << (uint32_t)b.b0 << (uint32_t)b.b1 << (uint32_t)b.b2 << (uint32_t)b.b3 << (uint32_t)b.b4 << (uint32_t)b.b5 << (uint32_t)b.b6 << (uint32_t)b.b7 << std::endl;
}
}
Если вы действительно хотите иметь функцию для доступа к ней, я полагаю, вы можете сделать что-то вроде что:
struct data8_t
{
struct bitfield
{
template <typename T>
void operator=(T rhs) {
data = (uint8_t)rhs;
}
operator unsigned char() const {
return (unsigned char)data;
}
union
{
uint8_t data;
struct
{
uint8_t b0 : 1,
b1 : 1,
b2 : 1,
b3 : 1,
b4 : 1,
b5 : 1,
b6 : 1,
b7 : 1;
};
};
};
template <typename T>
void operator=(T rhs) {
_data = (uint8_t)rhs;
}
operator unsigned char() const {
return (unsigned char)_data;
}
bitfield& toBits() { return _data; }
private:
bitfield _data;
};
Редактировать - заставить toBits работать с побитовым оператором присваивания