c++ - 您可以在不强制转换的情况下将位运算符与枚举类一起使用吗?
问题描述
int
我喜欢使用枚举类,但有时我将它们用作标志,如果我想使用按位运算符,我必须不断地转换为。有没有办法做到这一点而不铸造?我不认为你可以为他们定义运营商?
如果我有采用枚举类的函数,我必须这样做吗?
enum class Flags { FLAG1, FLAG2, FLAG3};
void setFlags(Flags flags){}
int main()
{
setFlags((Flags)((int)Flags::FLAG1 | (int)Flags::FLAG2 | (int)Flags::FLAG3));
}
解决方案
如果您不想自己在作用域枚举上重载运算符,为什么不使用为您执行此操作的库之一。
例如:
我自己创建了这样的库 - bitflags(它不是最好的,但可以满足我的要求),您可以通过指定以下内容来创建您的标志:
BEGIN_BITFLAGS(Flags)
FLAG(none)
FLAG(flag_a)
FLAG(flag_b)
FLAG(flag_c)
END_BITFLAGS(Flags)
然后你可以这样做:
int main() {
Flags flags = Flags::flag_a | Flags::flag_b;
if (flags & Flags::flag_a) {
std::cout << "flag_a is set" << std::endl;
} else {
std::cout << "flag_a is not set" << std::endl;
}
flags.toggle(Flags::flag_a);
// ...
return 0;
}
请注意,您不需要指定标志的类型,因为会自动使用最小尺寸类型,此外,您不需要指定标志的值。它们也是自动分配的。
推荐阅读
- algorithm - 树遍历运行时和空间分析一般方法
- r - 如何在 R 中更改 flexdashboard 的值框中的字体颜色
- sql - 如何合并在两个不同行上拆分的相同用户数据
- python - 计算 FFT 变换后时间序列的频率
- flutter - 未处理的异常:键入“列表”
' 不是类型 'Map 的子类型 在使用 Todo 应用程序时 - oracle - Oracle kerberos 身份验证服务规范化
- python - 使用 csv 使用 python 填写 web 表单
- deep-learning - 迁移学习是否需要在 0-255 之间重新缩放图像
- etsy - 有没有办法通过在 Etsy API 中列出来查询评论
- python - 为什么只有一个日期受 DST 影响?