Frage an c++, enums, c++11, typetraits, metaprogramming – Kann festgestellt werden, ob es sich bei einem Typ um einen Aufzählungstyp mit Gültigkeitsbereich handelt?

14

Gibt es ein Typmerkmal oder ist es möglich, ein Typmerkmal zu schreiben?is_scoped_enum<T> so dass:

obT ist eine Aufzählung mit Gültigkeitsbereich,is_scoped_enum<T>::value isttrue undobT ist irgendein anderer typ,is_scoped_enum<T>::value ist falsch
@ R.MartinhoFernandes: Ha; das kommt mir bekannt vor. :-)cxxreflect.codeplex.com/SourceControl/changeset/view/… (suchen nachCXXREFLECT_GENERATE_SCOPED_ENUM_OPERATORS) Visual C ++ wird leider nicht unterstütztconstexpr, was die Verwendung von Scoped-Enums für Flags ziemlich schmerzhaft macht, aber zumindest für die Operatorenbesser. Ich mag jedoch Ihre Charakterzüge. Für Flags benutze ich einflags<T> Klassentyp zum Umbrechen der Aufzählung. James McNellis
DurchBereichsaufzählungmeinten Sie C ++ 11 enum? Nawaz
@Nawaz: Ein Scoped Enum ist was einenum class heißt in C ++ 11 ja. James McNellis

Deine Antwort

1   die antwort
25

Ich denke, testen, ob es eine Aufzählung istund Nicht implizit konvertierbar in den zugrunde liegenden Typ sollte den Trick tun.

template <typename T, bool B = std::is_enum<T>::value>
struct is_scoped_enum : std::false_type {};

template <typename T>
struct is_scoped_enum<T, true>
: std::integral_constant<bool,
    !std::is_convertible<T, typename std::underlying_type<T>::type>::value> {};
Ich möchte hinzufügen (weil ich dieses Problem hatte): Dieses Merkmal könnte auch als eines implementiert werdenusing Anweisung (Vorlagenalias) wie vorgeschlagenHier, aber dannstd::underlying_type wird für alle Typen ausgewertet und einige Compiler erzeugen bei der Verwendung einen Fehlerunderlying_type mit Nicht-Aufzählungstypen (keine SFINAE). Diese Lösung ist also wahrscheinlich die beste. Excelcius
Verdammt, ich hoffe, ich habe es diesmal richtig gemacht: S So ein einfaches Konzept ... R. Martinho Fernandes
@KennyTM: Welcher Typ? C ++ 11 §7.2 / 2 besagt "TheAufzählungsbasis soll einen ganzzahligen Typ benennen; "Gibt es einen ganzzahligen Typ, in den nicht konvertiert werden kann?int? James McNellis
@KennyTM guter Punkt. Bearbeitet R. Martinho Fernandes

Verwandte Fragen