为了账号安全,请及时绑定邮箱和手机立即绑定

如何在C ++中使用枚举作为标志?

如何在C ++中使用枚举作为标志?

C++
梵蒂冈之花 2019-07-31 18:23:27
如何在C ++中使用枚举作为标志?将enums作为标志处理可以在C#中通过[Flags]属性很好地工作,但是在C ++中执行此操作的最佳方法是什么?例如,我想写:enum AnimalFlags{     HasClaws = 1,     CanFly =2,     EatsFish = 4,     Endangered = 8};seahawk.flags = CanFly | EatsFish | Endangered;但是,我收到关于int/ enum转换的编译器错误。是否有更好的表达方式而不仅仅是直接的铸造?优选地,我不想依赖来自第三方库的构造,例如boost或Qt。编辑:如答案中所示,我可以通过声明seahawk.flags为避免编译器错误int。但是,我想有一些机制来强制执行类型安全,所以有人不能写seahawk.flags = HasMaximizeButton。
查看完整描述

3 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

“正确”的方法是为枚举定义位运算符,如:

enum AnimalFlags{
    HasClaws = 1,
    CanFly =2,
    EatsFish = 4,
    Endangered = 8};inline AnimalFlags operator|(AnimalFlags a, AnimalFlags b){return static_cast<AnimalFlags>(static_cast<int>(a) | static_cast<int>(b));}

等等其他位运算符。如果枚举范围超出int范围,则根据需要进行修改。


查看完整回答
反对 回复 2019-07-31
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

注意(也有点偏离主题):使用位移可以完成另一种制作唯一标志的方法。我,我自己,发现这更容易阅读。

enum Flags{
    A = 1 << 0, // binary 0001
    B = 1 << 1, // binary 0010
    C = 1 << 2, // binary 0100
    D = 1 << 3, // binary 1000};

它可以将值保持为int,因此在大多数情况下,32个标志清楚地反映在移位量中。


查看完整回答
反对 回复 2019-07-31
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞


对于像我这样的懒人,这里是复制和粘贴的模板化解决方案:


template<class T> inline T operator~ (T a) { return (T)~(int)a; }

template<class T> inline T operator| (T a, T b) { return (T)((int)a | (int)b); }

template<class T> inline T operator& (T a, T b) { return (T)((int)a & (int)b); }

template<class T> inline T operator^ (T a, T b) { return (T)((int)a ^ (int)b); }

template<class T> inline T& operator|= (T& a, T b) { return (T&)((int&)a |= (int)b); }

template<class T> inline T& operator&= (T& a, T b) { return (T&)((int&)a &= (int)b); }

template<class T> inline T& operator^= (T& a, T b) { return (T&)((int&)a ^= (int)b); }


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 534 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信