Pytanie w sprawie enums, c++11, c++, metaprogramming, typetraits – Czy można określić, czy typ jest typem wyliczenia o zasięgu?

14

Czy istnieje cecha typu lub czy można napisać cechę typuis_scoped_enum<T> takie, że:

JeśliT jest wyliczeniem o zasięgu,is_scoped_enum<T>::value jesttrue iJeśliT jest inny typ,is_scoped_enum<T>::value to fałsz
Właśnie z ciekawości, jakie praktyczne zastosowania są dostępne dla tego? Xeo
@Nazaz: Enum o zasięgu to to, coenum class jest wywoływany w C ++ 11, tak. James McNellis
@ R.MartinhoFernandes: Ha; to wygląda znajomo. :-)cxxreflect.codeplex.com/SourceControl/changeset/view/… (szukaćCXXREFLECT_GENERATE_SCOPED_ENUM_OPERATORS) Niestety Visual C ++ nie obsługujeconstexpr, co sprawia, że ​​wyliczenia są dość bolesne dla flag, ale przynajmniej z operatoramilepszy. Jednak podoba mi się twoje cechy. Dla flag używałem aflags<T> typ klasy, aby zawinąć wyliczenie. James McNellis

Twoja odpowiedź

1   odpowiedź
25

Myślę, że testowanie to jest enumi niejawnie wymienialny na typ bazowy powinien załatwić sprawę.

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> {};
@ Dobry punkt KennyTM. Edytowane. R. Martinho Fernandes
@ James Oh, oops. R. Martinho Fernandes
@ KennyTM: Jaki typ? C ++ 11 §7.2 / 2 stwierdza „Theenum-base nazwa typu integralnego; ”czy istnieje typ integralny, którego nie można zamienić naint? James McNellis
Lepsze wykorzystaniestd::underlying_type<T> zamiastint. Naenum class w C ++ 11 może opierać się na czymś, czego nie można zamienićint. kennytm

Powiązane pytania