c++ - name - typedef enum c



Asegurar que el parámetro de plantilla sea una clase enum. (1)

¿Hay alguna manera de asegurar que un parámetro de plantilla sea un tipo de clase de enumeración?

Sé que type_traits tiene std::is_enum , pero no quiero que coincida con enumeraciones regulares, solo enum_classes.

Ejemplo del efecto deseado:

enum class EnumClass {};
enum Enum {};
class Class {};

template <typename T>
void Example()
{
    static_assert(/* T is EnumClass */, "`T` must be an enum class");
}

Example<EnumClass>(); // Ok
Example<Enum>(); // Error
Example<Class>(); // Error

Estoy usando C ++ 11, y desafortunadamente no puedo ir más alto (aunque de todos modos me gustaría saber la solución, incluso si se trata de estándares más nuevos).

¿Es posible?


Lo puedes lograr con:

template<typename T>
using is_class_enum = std::integral_constant<
   bool,
   std::is_enum<T>::value && !std::is_convertible<T, int>::value>;

Here una demo.

Si prefieres usar SFINAE, lo mismo se puede lograr con:

template<typename T, typename _ = void>
struct is_class_enum : std::false_type {
};

template<typename T>
struct is_class_enum <
  T,
  typename std::enable_if<std::is_enum<T>::value &&
                          !std::is_convertible<T, int>::value>::type> :
    public std::true_type {
};




template-meta-programming