Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包装枚举集_C++_Enums - Fatal编程技术网

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
}