包装枚举

时间:2018-11-30 11:04:21

标签: c++ enums

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

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::FLAT中的Props::SIGN

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

2 个答案:

答案 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
}

这是我通常处理持久性结构的可分组类型定义的方式。这里的优点是:

  • 子类型可以根据需要嵌套
  • 不同子类型的值之间存在间隙,因此Props的值与地面类型的数量无关。
  • 很容易检查值是否为类型

    bool isGround(int value) { return FIRST_GROUND <= value && INVALID_GROUND > value; }

  • 易于阅读且语法不太复杂