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范围,则根据需要进行修改。
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个标志清楚地反映在移位量中。
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); }
- 3 回答
- 0 关注
- 534 浏览
添加回答
举报