是否有可能在c ++中枚举枚举?

saj*_*jas 17 c++ enums

是否有可能在c ++中枚举枚举.我必须有类似的东西:

错误类型:

  • 类型1
  • 类型2
  • 类型3

类型1:

  • 原因1
  • 原因2

类型2:

  • cause3
  • cause4

类型3:

  • cause5
  • cause6

这些中的每一个都是整数值.它们应该用在通信协议栈中.在接收端,接收器必须从接收的值中解码错误的类型和原因.如果不能使用枚举,最好的方法是什么?

Jam*_*nze 7

我甚至不确定枚举的含义是什么意思.但通常的处理方法是在单个枚举中定义范围:

enum Errors
{
    type1 = 0x000,
    cause1,
    cause2,

    type2 = 0x100,
    cause3,
    cause4,
    ...
    causeMask = 0xFF,
    typeMask  = 0xFF00
};
Run Code Online (Sandbox Code Playgroud)

或者简单地用单独的单词定义单独的枚举,并使用 unsigned(或者unsigned short,或者什么)以及针对不同原因的一些转换.

无论采用何种解决方案,我都会将其封装在一个类中,以便客户端代码只需处理errorType()errorCause(); errorCause()甚至可以是错误类型值的模板.(但在某个地方,您需要为每个类型值显式特化,因为编译器不会知道如何将值映射到导致类型.)


Arn*_*rne 4

正如杰瑞所说,直接不可能。解决这个问题的一种方法是使用两个枚举。一种用于类别,一种用于子类别。

然而,正如 geogesl 所说,在协议中这样做可能会很危险。您绝对应该明确定义枚举值:

struct Error
{
   enum Type {
      UNKNOWNTYPE = 0,
      TYPE1 = 1,
      TYPE2 = 2,
      TYPE3 = 3
   };
   enum Subtype {
      UNKNOWNSUBTYPE = 0,
      // subtype for error type 1
      CAUSE1 = 1001,
      CAUSE2 = 1002,
      CAUSE3 = 1003,
      // subtype for error type 2
      CAUSE4 = 2001,
      CAUSE5 = 2002
   };

   Type type;
   Subtype subtype;
};

int main()
{
   Error error;
   error.type = Error::TYPE1;
   error.subtype = Error::CAUSE1;
}
Run Code Online (Sandbox Code Playgroud)

请务必明智地选择号码以供将来扩展。

更新:使示例实际工作。

替代的、类型更安全的解决方案:

struct ErrorType
{
   enum type {
      UNKNOWNTYPE = 0,
      TYPE1 = 1,
      TYPE2 = 2,
      TYPE3 = 3
   };
};

struct ErrorSubtype
{
   enum type {
      UNKNOWNSUBTYPE = 0,
      // subtype for error type 1
      CAUSE1 = 1001,
      CAUSE2 = 1002,
      CAUSE3 = 1003,
      // subtype for error type 2
      CAUSE4 = 2001,
      CAUSE5 = 2002
   };
};

struct Error
{
   ErrorType::type type;
   ErrorSubtype::type subtype;
};

int main()
{
   Error error;
   error.type = ErrorType::TYPE1;
   error.subtype = ErrorSubtype::CAUSE1;
}
Run Code Online (Sandbox Code Playgroud)