枚举成员值的类型特征

问题描述 投票:1回答:1

我具有类型特征以检查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个回答
0
投票

根据条件是否成立,您可以使用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
© www.soinside.com 2019 - 2024. All rights reserved.