Gibt es eine Möglichkeit, ein enum class
Feld in den zugrunde liegenden Typ zu konvertieren ? Ich dachte, das wäre automatisch, aber anscheinend nicht.
enum class my_fields : unsigned { field = 1 };
unsigned a = my_fields::field;
Diese Abtretung wird von GCC abgelehnt. error: cannot convert 'my_fields' to 'unsigned int' in assignment
.
enum
.[C++11: 7.2/9]
.Antworten:
Ich denke, Sie können std :: zugrunde liegender_Typ verwenden , um den zugrunde liegenden Typ zu kennen, und dann cast verwenden:
Damit müssen Sie den zugrunde liegenden Typ nicht annehmen oder ihn in der Definition des
enum class
Gleichenenum class my_fields : int { .... }
oder so nicht erwähnen .Sie können sogar eine generische Konvertierungsfunktion schreiben , die in den zugrunde liegenden Integraltyp konvertieren kann :
enum class
dann benutze es:
Und da die Funktion als deklariert ist
constexpr
, können Sie sie verwenden, wenn ein konstanter Ausdruck erforderlich ist:quelle
template <typename T> auto to_integral(T e) { return static_cast<std::underlying_type_t<T>>(e); }
constexpr
auch in der Zukunft; in der Tat viel mächtiger als das, was ich 2013 hatte: P)Sie können es nicht implizit konvertieren , aber eine explizite Besetzung ist möglich:
Beachten Sie auch, dass das Semikolon in der Definition Ihrer Aufzählung nach der geschlossenen geschweiften Klammer stehen sollte, nicht vorher.
quelle
Ich finde die folgende Funktion
underlying_cast
nützlich, wenn Enum-Werte korrekt serialisiert werden müssen.quelle
Wie andere bereits betont haben, gibt es keine implizite Besetzung, aber Sie können eine explizite verwenden
static_cast
. Ich verwende die folgenden Hilfsfunktionen in meinem Code, um in einen Aufzählungstyp und dessen zugrunde liegende Klasse zu konvertieren.Verwendungscode
quelle