https://eel.is/c++draft/class.mem#general-28
Который гласит:
В объединении стандартной компоновки с активным членом типа структуры T1
разрешено читать не- статический элемент данных m другого объединения
член структуры тип Т2 при условии, что m является частью общей исходной последовательности Т1 и Т2; поведение такое, как если бы был назначен соответствующий член
T1.
Я думаю, что допустимо создание объединения с несколькими (разными) структурами каждый из которых имеет элемент uint64_t:
Код: Выделить всё
template
struct CustomField
{
void operator=(uint64_t newVal)
{
val = someCustomInsertFn(newVal);
}
operator uint64_t() const
{
return someCustomExtractFn(val);
}
uint64_t val; // Note that this is used in a union and so aliases with all other fields and the `all` below
};
Код: Выделить всё
union CheckedBitField
{
struct { uint64_t all; }
CustomField fieldOne;
CustomField fieldTwo;
};
Но эти настраиваемые поля имеют собственные операторы voidoperator=(uint64_t newVal) и оператор uint64_t()const, которые могут добавлять дополнительные проверки того, что вы можете получить с помощью базового битового поля.
Примером функции вставки является добавьте дополнительные проверки того, что записываемое вами значение логически допустимо и/или не будет усечено.
Таким образом, этот код действителен - как и в обычном битовом поле:
Код: Выделить всё
CheckedBitField b{};
b.fieldOne = 5; // This runs custom code.
Полноценный работоспособный код, который добавляет функция установки минимального/максимального значения поля:
https://godbolt.org/z/ozz16GEP8
Подробнее здесь: https://stackoverflow.com/questions/792 ... -bitfields
Мобильная версия