c++ - 确保模板参数是枚举类

标签 c++ c++11 template-meta-programming

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

我知道 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

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

有可能吗?

最佳答案

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

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

Here一个演示。


如果您更喜欢使用 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 {
};

关于c++ - 确保模板参数是枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39807629/

相关文章:

c++ - 如何否定 boost::lambda:bind?

c++ - 是否可以将参数包扩展为不同的成员函数?

c++ - C++错误,编译器无法识别字符串::push_back [closed]

c++ - 专门化模板别名的最佳方法(或解决方法)

c++ - 参数列表中间的可变模板参数

c++ - 从 std::integer_sequence 调用带有模板参数的模板

c++ - iOS:在 Objective-C++ 中定义和使用 C++

C++ Qt : is it possible to create a sort of template slot?

数组类型的 C++ 伪析构函数

c++ - 想看懂这篇使用模板的论文