C++ 枚举成员值的类型特征

C++ 枚举成员值的类型特征,c++,c++17,typetraits,C++,C++17,Typetraits,我有一个类型特征来检查enum类是否包含名为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 {}; 模板 结构没有:

我有一个类型特征来检查
enum类
是否包含名为
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::false\u类型
{
};
模板
结构没有:std::true\u类型{};

此检查将与
std::is_enum_v
结合使用。问题是,我如何创建一个
type\u trait
,它将检查
Enum::None
的值是否为
0
?在谈论
类型特征时是否可能?

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

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
模板
constexpr自动枚举(E){
返回静态_-cast(e);
}
枚举类Foo{
无=0
};
枚举类栏{
无=1
};
模板
struct NoneAs0:std::conditional_t
{};
int main(){

std::cout您可以使用
conditional\u t
选择
true\u type
/
false\u type
作为基类,具体取决于条件是否为true:

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
模板
constexpr自动枚举(E){
返回静态_-cast(e);
}
枚举类Foo{
无=0
};
枚举类栏{
无=1
};
模板
struct NoneAs0:std::conditional_t
{};
int main(){

std::cout使用
std::enable\u如果

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 {};
模板
结构没有:std::false\u类型{};
模板
结构没有:std::true\u类型{};

使用
std::启用\u如果

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 {};
模板
结构没有:std::false\u类型{};
模板
结构没有:std::true\u类型{};

不确定是否需要,但如果枚举根本没有
None
常量,它就不起作用。不确定是否需要,但如果枚举根本没有
None
常量,它就不起作用。很好的解决方案,+1:)很好的解决方案,+1:)