我可以在内部使用 enum int 表示吗?
Can I use the enum int representation internally?
我想去掉代码中的大多数文字值,改用枚举。所以我创建了以下枚举:
enum Axis { X, Y, Z };
现在我想为此存储数据,发现我会这样做:
vector<T> x, y, z;
然后像这样创建很多 switch 语句:
switch (axis) {
case Axis::X:
return x;
break;
...
}
使用 int axis
,我能够做到
vector<vector<T>> data(3);
并使用 data[axis]
对其进行索引以获得正确的数据集。我想我也可以使用 Axis axis
并且仍然使用 data[axis]
隐式转换为 int
.
当我大部分时间都强制执行此枚举但也使用 Axis::X == 0
这一事实时,这是一件坏事吗?这是对使用 int axis
的改进,还是会使整个事情变得更复杂?
将枚举视为整数是完全可以的,只要您清楚自己在做什么。通常,像这样:
enum Axis {
X=0,
Y=1,
Z=2,
//axis_count=3, If you intend to iterate over values, add this
};
这让您自己和其他开发人员清楚地知道每个整数值都很重要,因此枚举有时会用作整数。
隐约相关,对位标志使用枚举也很常见,通常看起来更像这样:
enum ThingFlags {
IsTall = 1<<0,
IsWide = 1<<1,
IsLong = 1<<2,
IsHollow = 1<<3,
IsColored = 1<<4,
Mask = (1<<5)-1, //common to have a mask of all meaningful bits.
SizeMask = 0x7, //sometimes other masks too
};
这清楚地表明最低有效位表示高度,下一位是宽度,再下一位是长度,等等
我想去掉代码中的大多数文字值,改用枚举。所以我创建了以下枚举:
enum Axis { X, Y, Z };
现在我想为此存储数据,发现我会这样做:
vector<T> x, y, z;
然后像这样创建很多 switch 语句:
switch (axis) {
case Axis::X:
return x;
break;
...
}
使用 int axis
,我能够做到
vector<vector<T>> data(3);
并使用 data[axis]
对其进行索引以获得正确的数据集。我想我也可以使用 Axis axis
并且仍然使用 data[axis]
隐式转换为 int
.
当我大部分时间都强制执行此枚举但也使用 Axis::X == 0
这一事实时,这是一件坏事吗?这是对使用 int axis
的改进,还是会使整个事情变得更复杂?
将枚举视为整数是完全可以的,只要您清楚自己在做什么。通常,像这样:
enum Axis {
X=0,
Y=1,
Z=2,
//axis_count=3, If you intend to iterate over values, add this
};
这让您自己和其他开发人员清楚地知道每个整数值都很重要,因此枚举有时会用作整数。
隐约相关,对位标志使用枚举也很常见,通常看起来更像这样:
enum ThingFlags {
IsTall = 1<<0,
IsWide = 1<<1,
IsLong = 1<<2,
IsHollow = 1<<3,
IsColored = 1<<4,
Mask = (1<<5)-1, //common to have a mask of all meaningful bits.
SizeMask = 0x7, //sometimes other masks too
};
这清楚地表明最低有效位表示高度,下一位是宽度,再下一位是长度,等等