name enum c++ c++11 template-meta-programming

c++ - name - Asegurar que el parámetro de plantilla sea una clase enum.



enum c (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 { };