通过[Flags]
属性将enum
作为标志在C#中工作得很好,但是在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
了。
发布于 2009-09-19 12:37:59
“正确”的方法是为枚举定义位运算符,如下所示:
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范围,请根据需要进行修改。
发布于 2012-04-06 17:09:40
注意(也有点离题):另一种制作唯一标志的方法是使用位移位。我,我自己,发现这更容易阅读。
enum Flags
{
A = 1 << 0, // binary 0001
B = 1 << 1, // binary 0010
C = 1 << 2, // binary 0100
D = 1 << 3 // binary 1000
};
它可以将值保存到int,因此,在大多数情况下,32个标志可以清楚地反映在移位量中。
发布于 2014-04-18 18:51:07
对于像我这样的懒人,这里有一个模板化的解决方案来复制和粘贴:
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); }
https://stackoverflow.com/questions/1448396
复制相似问题