我一直在尝试创建带有子枚举的主枚举类型,以提高可读性和用法。这是我的意思的示例:

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,但由于GroundProps均为0,因此无法区分Ground::FLATProps::SIGN

我正在寻找使用enum class,但由于每个枚举将是一个不同的类,所以我将无法使用TileType type = TileType::Ground::Flat

最佳答案

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
}

这是我通常处理持久性结构的可分组类型定义的方式。这里的优点是:
  • 子类型可以根据需要嵌套
  • 不同子类型的值之间存在间隙,因此Props的值不依赖于Ground类型
  • 的数量
  • 很容易检查值是否为类型
    bool isGround(int value) { return FIRST_GROUND <= value && INVALID_GROUND > value; }
  • 易于阅读且语法不太复杂的
  • 08-25 08:08