Стандартные объединения макетов с общей начальной последовательностью для создания отмеченных битовых полей в качестве зC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Стандартные объединения макетов с общей начальной последовательностью для создания отмеченных битовых полей в качестве з

Сообщение Anonymous »

Для class.mem/28:
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;
};
Идея заключается в том, что это простое объединение членов структуры, каждый из которых имеет значение uint64_t.
Но эти настраиваемые поля имеют собственные операторы voidoperator=(uint64_t newVal) и оператор uint64_t()const, которые могут добавлять дополнительные проверки того, что вы можете получить с помощью базового битового поля.
Примером функции вставки является добавьте дополнительные проверки того, что записываемое вами значение логически допустимо и/или не будет усечено.
Таким образом, этот код действителен - как и в обычном битовом поле:

Код: Выделить всё

CheckedBitField b{};
b.fieldOne = 5; // This runs custom code.
Нарушает ли добавление этих дополнительных функций правила class.mem/28 и/или я что-то упускаю?
Полноценный работоспособный код, который добавляет функция установки минимального/максимального значения поля:
https://godbolt.org/z/ozz16GEP8

Подробнее здесь: https://stackoverflow.com/questions/792 ... -bitfields
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»