C++ 包装枚举集
我一直在尝试创建一个带有子枚举的主枚举类型,以提高可读性和使用率。以下是我的意思的一个例子:C++ 包装枚举集,c++,enums,C++,Enums,我一直在尝试创建一个带有子枚举的主枚举类型,以提高可读性和使用率。以下是我的意思的一个例子: enum TileType { enum Ground { FLAT, SLOPE // ... }, enum Props { SIGN // ... } // ... }; 可以引用为TileType type=TileType::Ground::FLAT,以获得更好的层次结构 我想到了在名称空间中包装枚举: namespace T
enum TileType {
enum Ground {
FLAT,
SLOPE // ...
},
enum Props {
SIGN // ...
}
// ...
};
可以引用为TileType type=TileType::Ground::FLAT
,以获得更好的层次结构
我想到了在名称空间中包装枚举:
namespace TileType {
enum Ground {
FLAT,
SLOPE // ...
};
enum Props {
SIGN // ...
};
// ...
};
我可以将其用作int-TileType::Ground::FLAT
,但我无法区分Props
的Ground
,因为Ground::FLAT
和Props::SIGN
都将为0
使用
enum类
可能是我想要的,但我不能使用TileType type=TileType::Ground::Flat
,因为每个枚举都是不同的类。枚举通常不是好的做法
考虑将枚举包装在一个结构(或单独的结构)中,或者更好地包装在一个类中
对于从0开始的两个枚举,您可以按照一些注释的建议进行操作,或者选择彼此相差很大的起始范围
但这是程序员需要解决的上下文问题(只要变量区分类型,我看不出两者都从0开始有问题)
范例
struct TileType
{
enum Ground {
FLAT = 0,
SLOPE = 1, // ...
};
enum Props {
SIGN = 9999 // ...
};
};
这是我通常处理持久结构的可分组类型定义的方式。这里的优点是:
- 可以根据需要嵌套子类型
- 不同子类型的值之间存在差异,因此道具的值不依赖于地面类型的数量
- 很容易检查值是否为类型
bool isGround(int值){返回第一个地面值;}
- 易于阅读且语法不太复杂
SIGN=SLOPE+1
?这可以做到,但作为。。。建议,此列表将随着我添加功能而增长,并且很快将无法维护。如果您在每个集合中使用一个常量(未使用)名称(GROUND\u last
),则SIGN=GROUND\u last
只需在集合中的\u last
枚举之前添加新枚举即可。事实上,它正在按计划工作!感谢您记住,如果您使用这些枚举用于任何持久的文件结构,则在中间添加中间值将围绕以下常量的值偏移,这可能会使向后兼容性成为一个巨大的麻烦。在子枚举的值之间留有间隙可能是个好主意,因为在插入Ground::WATERY时,它允许Props::SIGN保留其以前的值。
enum TileTypes
{
GroundTypes = 1000
PropTypes = 2000
}
enum Ground
{
FIRST_GROUND = GroundTypes,
FLAT = FIRST_GROUND,
SLOPE,
...,
INVALID_GROUND
}
enum Props
{
FIRST_PROP = PropTypes,
SIGN = FIRST_PROP,
...,
INVALID_PROP
}