如何解决您可以对枚举类使用按位运算符而不进行强制转换吗?
我喜欢使用枚举类,但是有时我将它们用作标志,并且如果要使用按位运算符,则必须不断地强制转换为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;
}
请注意,由于最小尺寸类型是自动使用的,因此不需要指定标志的类型,此外,您无需指定标志的值。它们也会自动分配。
,在class
之后的enum
指定枚举是强类型的,并且其枚举器是作用域的。注意,enum class
仅在默认情况下定义了赋值,初始化和比较。不过,枚举是用户定义的类型,因此,您可以为其定义运算符。
如果您不想显式限定枚举器名称,并且希望枚举器值为ints
(无需显式转换),则可以从class
中删除enum class
得到“普通” enum
。枚举器被导出到周围的范围以避免名称冲突,您可以使用名称空间进行包装。
#include <iostream>
namespace Flags {
enum : int
{
bit_1 = 0x1,bit_2 = 0x2
};
}
int main()
{
int num = 11;
if (num & Flags::bit_1)
std::cout << "lsb is on!\n";
else
std::cout << "lsb is off!\n";
return 0;
}
参考:
- Bjarne Stroustrup的C ++第二版导览
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。