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 {
};