Один из способов - привести тип enum к типу подложки.Это можно сделать с помощью уже определенного std::underlying_type_t
, чтобы получить внутреннее представление перечисления.
template < typename T>
auto toUnderlayingType( T t )
{
return static_cast<std::underlying_type_t< T >>( t );
}
template < typename T, typename U = std::underlying_type_t< T > >
void readToEnum( U u , T& t )
{
t = static_cast< T >( u );
}
class Y
{
public:
enum class X
{
ONE,
TWO
} x;
Y(): x{X::ONE} { }
void Print()
{
std::cout << toUnderlayingType(x) << std::endl;
}
void Read()
{
std::underlying_type_t< X > tmp;
std::cin >> tmp;
readToEnum( x, tmp );
}
};
int main()
{
Y y;
y.Print();
}
Но в случае сериализации даже лучше использовать лучшее представление содержимого и данных.Поскольку отражение все еще не является частью c ++, вам нужно преобразовать значение enum в любой полезный вывод и обратно.Возможно, вы напишите в файл текст «ОДИН» вместо 0.Но все это для широкого ответа.Существует длинный список библиотек сериализаторов, таких как boost и cerial
. Необходимо проверить, является ли входящее значение действительным.Имея приведенный выше пример и присвоив ему числовое значение 3, значение enum является недействительным.Эта тема уже обсуждалась здесь: Что произойдет, если вы укажете недопустимое значение static_cast в enum class?