Pergunta sobre typetraits, metaprogramming, enums, c++, c++11 – É possível determinar se um tipo é um tipo de enumeração com escopo definido?

14

Existe um traço de tipo ou é possível escrever um traço de tipois_scoped_enum<T> de tal modo que:

E seT é uma enumeração com escopo definidois_scoped_enum<T>::value étrue eE seT é qualquer outro tipois_scoped_enum<T>::value é falso
@ R.MartinhoFernandes: Ha; isso parece familiar. :-)cxxreflect.codeplex.com/SourceControl/changeset/view/… (procurar porCXXREFLECT_GENERATE_SCOPED_ENUM_OPERATORS) Infelizmente, o Visual C ++ não suportaconstexpr, que faz enums escopo bastante doloroso para usar para bandeiras, mas pelo menos com os operadores éMelhor. Eu gosto do seu uso de traços, no entanto. Para bandeiras, eu tenho usado umflags<T> tipo de classe para envolver a enumeração. James McNellis
Apenas por curiosidade, que aplicações práticas existem para este? Xeo
@Nawaz: Um enum com escopo é o queenum class é chamado em C ++ 11, sim. James McNellis
Porenum escopo, você quis dizer enum do C ++ 11? Nawaz

Sua resposta

1   a resposta
25

Eu acho que testar se é um enume não implicitamente conversível para o tipo subjacente deve fazer o truque.

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> {};
Porra, espero ter acertado desta vez: S Um conceito tão simples ... R. Martinho Fernandes
@James Oh, opa. R. Martinho Fernandes
e mais uma correção, deve ser! std :: is_convertible <...> :: value Gene Bushuyev
Eu gostaria de adicionar (porque eu tive esse problema): Este traço também poderia ser implementado como umusing instrução (alias de modelo) como sugeridoAqui, mas entãostd::underlying_type será avaliado para todos os tipos, e alguns compiladores geram um erro ao usarunderlying_type com tipos não-enum (sem SFINAE). Então essa solução é provavelmente a melhor. Excelcius

Perguntas relacionadas