我具有类型特征以检查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
甚至可能吗?
根据条件是否成立,您可以使用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