Есть ли способ преобразовать enum class
поле в базовый тип? Я думал, что это будет автоматически, но, видимо, нет.
enum class my_fields : unsigned { field = 1 };
unsigned a = my_fields::field;
Это задание отклоняется GCC. error: cannot convert 'my_fields' to 'unsigned int' in assignment
.
enum
.[C++11: 7.2/9]
.Ответы:
Я думаю, вы можете использовать std :: under_type, чтобы узнать базовый тип, а затем использовать приведение:
При этом вам не нужно предполагать базовый тип или упоминать его в определении чего-то
enum class
подобногоenum class my_fields : int { .... }
.Вы даже можете написать общую функцию преобразования, которая должна иметь возможность преобразовывать любое значение
enum class
в свой базовый интегральный тип:затем используйте это:
А так как функция объявлена
constexpr
, вы можете использовать ее там, где требуется постоянное выражение:источник
template <typename T> auto to_integral(T e) { return static_cast<std::underlying_type_t<T>>(e); }
constexpr
, а в будущем, на самом деле гораздо более мощным , чем один , что я имел в 2013 году: P)Вы не можете преобразовать его неявно , но возможно явное приведение:
Также имейте в виду, что точка с запятой должна стоять после закрытой фигурной скобки в определении вашего перечисления, а не до нее.
источник
Я считаю, что следующая функция
underlying_cast
полезна при правильной сериализации значений перечисления.источник
Как указывали другие, неявного приведения нет, но вы можете использовать явное
static_cast
. Я использую в своем коде следующие вспомогательные функции для преобразования в тип перечисления и его базовый класс и обратно.Код использования
источник