在我的项目中,我有几个类似的枚举声明;
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)
一种常见的(但不是特别优雅)链接enum在一起的方式(例如,如果子类需要扩展一个唯一的集合)是每个都enum提供一个"最后"值并使用它来启动下一个:
enum Comparison
{
LT, // "<"
...
NEQ, // "!="
LastComparison
};
enum Logical
{
AND = LastComparison,
OR,
...
LastLogical
};
Run Code Online (Sandbox Code Playgroud)