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:)