确保模板参数是枚举类

Gil*_*man 20 c++ template-meta-programming c++11

有没有办法确保模板参数是枚举类型?

我知道type_traitsstd::is_enum,但我不希望它匹配常规枚举,只是enum_classes.

想要效果的示例:

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
Run Code Online (Sandbox Code Playgroud)

我使用的是C++ 11,不幸的是不能再高了(虽然我很想知道解决方案,即使它涉及更新的标准).

可能吗?

Bia*_*sta 21

您可以通过以下方式实现:

template<typename T>
using is_class_enum = std::integral_constant<
   bool,
   std::is_enum<T>::value && !std::is_convertible<T, int>::value>;
Run Code Online (Sandbox Code Playgroud)

是一个演示.


如果您更喜欢使用SFINAE,可以通过以下方式实现:

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 {
};
Run Code Online (Sandbox Code Playgroud)