Я пытаюсь сериализовать и десериализовать (используя QDataStream
, но это не имеет значения) переменная enum class
:
enum class Type : char
{
Trivial,
Complex
};
Сериализация проста:
QDataStream &operator<<(QDataStream &stream, Type type)
{
return stream << static_cast<char>(type);
}
Но десериализация не является:
QDataStream &operator>>(QDataStream &stream, Type &type)
{
return stream >> static_cast<char &>(type);
}
Очевидно, что static_cast
ссылки на enum class
на ссылку на базовый тип недопустимы. Кроме того, «очевидное» решение:
QDataStream &operator>>(QDataStream &stream, Type &type)
{
return stream >> reinterpret_cast<char &>(type);
}
может на самом деле быть недопустимым и не определяться стандартом в соответствии с ответом на этот вопрос , поскольку эквивалентное выражение return stream >> (*static_cast<char *>(static_cast<void *>(&type)));
там объявлено недопустимым (или, скорее, не определено стандартом). Если бы это было так, я должен был бы сделать это:
QDataStream &operator>>(QDataStream &stream, Type &type)
{
char c = 0;
stream >> c;
type = static_cast<Type>(c);
return stream;
}
, что НЕ красиво, это 4 строки вместо 1 и т. Д. И т. Д. И мне кажется, что для такой (казалось бы) простой вещи мне не нужно
Мой вопрос: Является ли reinterpret_cast
или эквивалент static_cast
через void*
действительно недопустимым (не определенным стандартом) при приведении ссылки на переменную enum class
к ссылке на ее базовый тип?