【问题标题】:Ensure template parameter is an enum class [duplicate]确保模板参数是枚举类[重复]
【发布时间】:2017-02-09 23:35:16
【问题描述】:

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

我知道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,不幸的是不能再高了(尽管我很想知道解决方案,即使它涉及到更新的标准)。

有可能吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 如果我错了,请纠正我,但你只是依赖于枚举类不能隐式转换为积分的事实?难道不能定义隐式转换运算符吗?
    • @GiladNaaman 如何从 enum class 定义隐式运算符?
    • 是的,我的错,您实际上不能在 enum class 中定义运算符或函数。
    • 不应该使用std::underlying_type_t&lt;T&gt; 而不仅仅是int 作为std::is_convertible&lt;&gt; 检查类型吗?
    • @SergeyNikitin 没有意义,正确地执行underlying_type 实际上很棘手(除非您知道T 实际上是一个枚举类型,否则您无法实例化它)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多