我可以使用类型特征从 c++ 中的枚举值推断枚举的类型吗?
Can I use type traits to deduce the type of an enum from an enum value in c++?
在下面的示例中,我创建了一些基于枚举值模板化的流畅方法,用于测试值是否包含特定标志。
#include <type_traits>
// Scoped flags enum
enum class Flags {
One = 1 << 0,
Two = 1 << 1
};
// Template method for enum bitwise and operator
template< typename enum_type >
constexpr enum_type bitwise_and_operator(enum_type lhs, enum_type rhs) {
typedef typename std::underlying_type<enum_type>::type fundamental_type;
return static_cast<enum_type>(static_cast<fundamental_type>(lhs) & static_cast<fundamental_type>(rhs));
}
// Flags and operator
constexpr Flags operator&(Flags lhs, Flags rhs) {
return bitwise_and_operator<Flags>(lhs, rhs);
}
// Template method for enum flag
template< typename enum_type, enum_type enum_value >
constexpr bool Flagged(enum_type type) {
return (type & enum_value) == enum_value;
}
// Has flag one?
constexpr bool HasOne(Flags flags) {
return Flagged<Flags, Flags::One>(flags);
};
// Has flag two?
constexpr bool HasTwo(Flags flags) {
return Flagged<Flags, Flags::Two>(flags);
};
int main() {
auto flag = Flags::One;
auto True = HasOne(flag);
auto False = HasTwo(flag);
return 0;
}
包括两个模板参数 Flags 和 Flags::One,可能比编译器所需的信息更多。
是否可以构建一个可以调用为:
constexpr bool HasOne(Flags flags) {
return Flagged<Flags::One>(flags);
};
我将如何构造一个在编译时从值推断枚举类型的方法? 还是有另一个编译时解决方案可以解决这个问题?
提前谢谢。
您希望
enum_value
作为模板参数的原因是什么?您可以简单地将其作为另一个参数传递:
template <typename enum_type>
constexpr bool Flagged(enum_type src, enum_type flag) {
return (src & flag) == flag;
}
// Has flag one?
constexpr bool HasOne(Flags flags) {
return Flagged(flags, Flags::One);
};
截至目前,仅使用宏:
#define FLAGGED(x,y) Flagged<decltype(x),x>(y)
有一个提案正在制定中来解决这个问题。
相关文章:
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 如何注册枚举类型到QJSEngine,以便在脚本环境中使用?
- 通过包装器从 C 访问C++ API 时,如何访问枚举类型
- C++/错误:表达式必须具有整数或无作用域枚举类型
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 在类访问混淆中声明的枚举类型
- 在枚举类型上使用std::max是不是一种糟糕的做法
- C++ 在方程中使用变量;错误:表达式必须具有整数或无作用域枚举类型及其他
- 是否可以使用泛型枚举类型作为函数的参数?
- Visual Studio 2017 生成工具与枚举类型的问题
- 使用枚举类型管理存储顺序
- 如何检查类中定义的枚举类型变量是否被分配给?
- 如何从枚举类型中获取枚举值?
- 为什么C++不为枚举类型提供默认"operator>>"函数?
- 确保枚举类型的键/值在软件Revs之间永远不会更改
- MSVC 1 位枚举类型等于 -1,并且相等性测试失败
- 我们可以专业化类模板的枚举(类型)成员吗?
- 错误:以增量方式填充向量时,表达式必须具有整数或无作用域枚举类型
- 枚举类型的重载>>运算符(工作日)
- C 中的枚举类型字符串类别