C++ 确保模板参数是枚举类

C++ 确保模板参数是枚举类,c++,c++11,template-meta-programming,C++,C++11,Template Meta Programming,有没有办法确保模板参数是枚举类类型 我知道type\u traits有std::is\u enum,但我不想让它匹配常规枚举,只想匹配枚举类 想要的效果示例: enum class EnumClass {}; enum Enum {}; class Class {}; template <typename T> void Example() { static_assert(/* T is EnumClass */, "`T` must be an enum class");

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

我知道
type\u traits
std::is\u enum
,但我不想让它匹配常规枚举,只想匹配枚举类

想要的效果示例:

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
enum类enum类{};
枚举{};
类{};
模板
void示例()
{
静态_断言(/*T是EnumClass*/,“`T`必须是enum类”);
}
示例();//好啊
示例();//错误
示例();//错误
我使用的是C++11,不幸的是不能再高了(尽管我很想知道这个解决方案,即使它涉及到更新的标准)


有可能吗?

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

template<typename T>
using is_class_enum = std::integral_constant<
   bool,
   std::is_enum<T>::value && !std::is_convertible<T, int>::value>;
模板
使用is_class_enum=std::integral_常量<
布尔,
std::is_enum::value&&!标准::是否可转换::值>;
演示


如果您喜欢使用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 {
};
模板
结构是\u类\u枚举:std::false\u类型{
};
模板
结构是类枚举<
T
typename std::enable_if::type>:
公共std::true\u类型{
};

如果我错了,请纠正我的错误,但您仅仅依赖于枚举类不能隐式转换为积分这一事实?难道不能定义隐式转换运算符吗?@GiladNaaman如何从
枚举类定义隐式运算符?是的,我的错,实际上,您不能在
enum类中定义运算符或函数。不应该使用
std::底层类型\u t
而不仅仅是
int
作为
std::是否可转换
检查类型吗?@SergeyNikitin没有意义,正确地执行
底层类型
实际上很棘手(在知道
T
实际上是一个枚举类型之前,不能实例化它)。