结合枚举c ++

Ske*_*een 10 c++ enums c++11

在我的项目中,我有几个类似的枚举声明;

enum Comparison
{
    LT,     // "<"
    GT,     // ">"
    EQ,     // "=="
    LTEQ,   // "<="
    GTEQ,   // ">="
    NEQ     // "!="
};
enum Arithmetic
{
    ADD,    // "+"
    SUB,    // "-"
    MUL,    // "*"
    DIV,    // "/"
    MOD,    // "%"
};
Run Code Online (Sandbox Code Playgroud)

我想将其中的几个组合成一个单独的组合枚举,这样;

  • 所有元素(来自子枚举)都存在于组合枚举中.
  • 所有元素都具有独特的价值(显然).
  • 所有元素在组合枚举和原始元素中具有一致的值.

像这样:

enum Comparison
{
    LT,     // "<"
    GT,     // ">"
    EQ,     // "=="
    LTEQ,   // "<="
    GTEQ,   // ">="
    NEQ     // "!="

    ADD,    // "+"
    SUB,    // "-"
    MUL,    // "*"
    DIV,    // "/"
    MOD,    // "%"
};
Run Code Online (Sandbox Code Playgroud)

我还希望能够做的是,将组合枚举"转换"为原始组合之一,仅考虑组合枚举中的值(假设值一致,则应该是微不足道的).

枚举的替代方法是基于类的解决方案,其中类实现operator int()运算符.

注意; 我相信这operator int()是某种方式.

Moo*_*uck 18

我经常看到的是:

enum OperationType {
    Comparison = 0x100,
    Arithmetic = 0x200
};        

enum ComparisonType
{
    LT = Comparison,     // "<"
    GT,     // ">"
    EQ,     // "=="
    LTEQ,   // "<="
    GTEQ,   // ">="
    NEQ     // "!="
};
enum ArithmeticType
{
    ADD = Arithmetic,    // "+"
    SUB,    // "-"
    MUL,    // "*"
    DIV,    // "/"
    MOD,    // "%"
};
Run Code Online (Sandbox Code Playgroud)

这比简单链接提供了更多的灵活性,因为现在你可以在不破坏算术的情况下添加比较,而算术和比较不需要了解彼此.获取枚举类型也变得微不足道:

constexpr OperationType getOperationType(unsigned value)
{return static_cast<OperationType>(value&0xFF00);}
Run Code Online (Sandbox Code Playgroud)

  • @Skeen:目的是确保每个类别/类型都有足够的空间.即使在单个枚举中也无法防止重复. (2认同)

Ben*_*son 6

一种常见的(但不是特别优雅)链接enum在一起的方式(例如,如果子类需要扩展一个唯一的集合)是每个都enum提供一个"最后"值并使用它来启动下一个:

enum Comparison
{
    LT,     // "<"
    ...
    NEQ,    // "!="
    LastComparison
};

enum Logical
{
    AND = LastComparison,
    OR,
    ...
    LastLogical
};
Run Code Online (Sandbox Code Playgroud)