【问题标题】:Type trait for enum member value枚举成员值的类型特征
【发布时间】:2020-03-12 12:54:30
【问题描述】:

我有一个类型特征来检查enum class 是否包含一个名为None 的成员。

template<typename T, typename = void>
    struct has_none : std::false_type
    {
    };

template<typename T>
struct has_none<T,
    std::void_t<decltype(T::None)>> : std::true_type {};

此检查将与std::is_enum_v 结合使用。问题是,我将如何创建一个type_trait 来检查Enum::None 的值是否为0?在谈论type_traits时甚至可能吗?

【问题讨论】:

    标签: c++ c++17 typetraits


    【解决方案1】:

    使用std::enable_if:

    template <typename T, typename = void>
    struct has_none : std::false_type {};
    
    template <typename T>
    struct has_none<T, std::enable_if_t<T::None == T(0)>> : std::true_type {};
    

    【讨论】:

    • 不错的解决方案,+1 :)
    【解决方案2】:

    您可以使用conditional_t 选择true_type/false_type 作为基类,具体取决于条件是否为真:

    template<class E>
    constexpr auto EnumToInt(E e) {
        return static_cast<std::underlying_type_t<E>>(e);
    }
    enum class Foo {
        None = 0
    };
    enum class Bar {
        None = 1
    };
    template<class T>
    struct NoneAs0 : std::conditional_t< EnumToInt(T::None) == 0,
        std::true_type, std::false_type>
    {};
    
    int main() {
        std::cout << NoneAs0<Foo>::value << std::endl; // 1
        std::cout << NoneAs0<Bar>::value << std::endl; // 0
    

    【讨论】:

    • 不确定是否有意,但如果枚举根本没有 None 常量,它就不起作用。
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2019-01-05
    • 2016-09-08
    相关资源
    最近更新 更多