Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to determine if a type is a scoped enumeration type?

Tags:

Is there a type trait, or is it possible to write a type trait is_scoped_enum<T> such that:

  • if T is a scoped enumeration, is_scoped_enum<T>::value is true and
  • if T is any other type, is_scoped_enum<T>::value is false
like image 512
James McNellis Avatar asked May 23 '12 17:05

James McNellis


People also ask

What is a scoped enumeration?

Scoped enums (enum class/struct) are strongly typed enumerations introduced in C++11. They address several shortcomings of the old C-style (C++98) enums, mainly associated with type-safety and name collisions.

How do you check if a type is an enum?

In C#, we can check the specific type is enum or not by using the IsEnum property of the Type class. It will return true if the type is enum. Otherwise, this property will return false. It is a read-only property.


1 Answers

I think testing if it is an enum and not implicitly convertible to the underlying type should do the trick.

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> {}; 
like image 158
R. Martinho Fernandes Avatar answered Sep 28 '22 12:09

R. Martinho Fernandes