Czy istnieje sposób na przekonwertowanie enum class
pola na typ bazowy? Myślałem, że to będzie automatyczne, ale najwyraźniej nie.
enum class my_fields : unsigned { field = 1 };
unsigned a = my_fields::field;
To przypisanie jest odrzucane przez GCC. error: cannot convert 'my_fields' to 'unsigned int' in assignment
.
enum
.[C++11: 7.2/9]
.Odpowiedzi:
Myślę, że możesz użyć std :: Base_type, aby poznać podstawowy typ, a następnie użyć rzutowania:
Dzięki temu nie musisz zakładać typu bazowego lub nie musisz wspominać o tym w definicji czegoś
enum class
podobnegoenum class my_fields : int { .... }
.Możesz nawet napisać ogólną funkcję konwertującą, która powinna być w stanie przekonwertować dowolny
enum class
na jego podstawowy typ całkowity :następnie użyj go:
A ponieważ funkcja jest zadeklarowana jako
constexpr
, możesz jej użyć tam, gdzie wymagane jest wyrażenie stałe:źródło
template <typename T> auto to_integral(T e) { return static_cast<std::underlying_type_t<T>>(e); }
constexpr
drogą , ty też masz w przyszłości; w rzeczywistości dużo potężniejszy niż ten, który miałem w 2013: P)Nie można go przekonwertować niejawnie , ale możliwe jest jawne rzutowanie:
Pamiętaj również, że średnik powinien znajdować się po zamkniętym nawiasie klamrowym w definicji wyliczenia, a nie przed.
źródło
Uważam, że następująca funkcja jest
underlying_cast
przydatna, gdy trzeba poprawnie serializować wartości wyliczenia.źródło
Jak zauważyli inni, nie ma niejawnego rzutowania, ale możesz użyć jawnego
static_cast
. Używam następujących funkcji pomocniczych w moim kodzie, aby konwertować do iz typu wyliczeniowego i jego klasy bazowej.Kod użytkowania
źródło