我一直在尝试创建带有子枚举的主枚举类型,以提高可读性和用法。这是我的意思的示例:
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
,但是由于Ground
和Props
都为0,因此无法区分Ground::FLAT
中的Props::SIGN
可能正在使用enum class
,但由于每个枚举将是一个不同的类,所以我将无法使用TileType type = TileType::Ground::Flat
。
答案 0 :(得分:0)
枚举通常不是一个好习惯。
请考虑将枚举封装在一个结构(或单独的结构)或更佳的类中。
对于两个枚举都从0开始,您可以按照一些注释的建议进行操作,也可以选择彼此完全不同的起始范围。
但这是程序员需要解决的上下文问题(只要变量能够区分类型,我都不会看到两者都从0开始的问题)。
示例
struct TileType
{
enum Ground {
FLAT = 0,
SLOPE = 1, // ...
};
enum Props {
SIGN = 9999 // ...
};
};
答案 1 :(得分:0)
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
}
这是我通常处理持久性结构的可分组类型定义的方式。这里的优点是:
很容易检查值是否为类型
bool isGround(int value) { return FIRST_GROUND <= value && INVALID_GROUND > value; }
易于阅读且语法不太复杂