如何在C++;? 我在C++中有几个类似于标志的枚举。例如: enum some_state { state_normal = 1 << 0, state_special = 1 << 1, state_somethingelse = 1 << 2, state_none = 0, }; some_state var1; 枚举某些状态{ state_normal=1

如何在C++;? 我在C++中有几个类似于标志的枚举。例如: enum some_state { state_normal = 1 << 0, state_special = 1 << 1, state_somethingelse = 1 << 2, state_none = 0, }; some_state var1; 枚举某些状态{ state_normal=1,c++,enums,operator-overloading,C++,Enums,Operator Overloading,我尝试并搜索过,我认为最好的解决方案是a#define。基于: 这可以像这样使用: enum some_state { state_normal = 1 << 0, state_special = 1 << 1, state_somethingelse = 1 << 2, state_none = 0, }; FLAGS(some_state) some_state var1; 事实上,Windo

我尝试并搜索过,我认为最好的解决方案是a#define。基于:

这可以像这样使用:

enum some_state {
  state_normal        = 1 << 0,
  state_special       = 1 << 1,
  state_somethingelse = 1 << 2,
  state_none          = 0,
};
FLAGS(some_state)

some_state var1;
事实上,Windows SDK必须做到这一点


另一种方法是包装器类


或者使用类似的方法。不过,您可能需要一个最新的编译器。

我尝试并搜索过,我认为最好的解决方案是定义。基于:

enum some_state {
  state_normal        = 1 << 0,
  state_special       = 1 << 1,
  state_somethingelse = 1 << 2,
  state_none          = 0,
};

int main() {
    some_state var1 = state_normal;
    some_state var2 = state_special;
    unsigned int var3 = var1 | var2;
}
这可以像这样使用:

enum some_state {
  state_normal        = 1 << 0,
  state_special       = 1 << 1,
  state_somethingelse = 1 << 2,
  state_none          = 0,
};
FLAGS(some_state)

some_state var1;
事实上,Windows SDK必须做到这一点


另一种方法是包装器类

或者使用类似的方法。不过,您可能需要一个最新的编译器。

枚举一些状态{
enum some_state {
  state_normal        = 1 << 0,
  state_special       = 1 << 1,
  state_somethingelse = 1 << 2,
  state_none          = 0,
};

int main() {
    some_state var1 = state_normal;
    some_state var2 = state_special;
    unsigned int var3 = var1 | var2;
}
state_normal=1
枚举某些_状态{


state_normal=1使用现有模板库,如提供操作,而不是编写自己的操作。

使用现有模板库,如提供操作,而不是编写自己的操作。

很好,您回答了自己的问题!:)如果您真的想这样做,内联而不是静态会有更好的效果链接器的mantics——第一种近似方法是,静态意味着它可以在这个文件中使用,而只有在这个文件中,内联意味着它可以在多个文件中定义。@Akanksh:你有什么反对意见吗?哦,没有,如果是这样的话,我很抱歉,我只是非常尊重那些试图自己找到解决方案而不是仅仅提出解决方案的人我的最后一个评论是以最好的方式表示的,我道歉,如果它看起来不是这样的话。我现在在使用你的建议。如果这真的是唯一的方法来实现它,那么我认为它是一个不一致的<代码> EnUM类< /Cord>在C++中的实现,你回答了你自己的问题!o对于链接器来说,内联而不是静态会有更好的语义-首先,静态意味着它可以在这个文件中使用,并且只有在这个文件中,内联意味着它可以在多个文件中定义。@Akanksh:你有什么反对它的吗?哦,不,如果是这样的话,很抱歉,我只是非常尊重那些试图找到它的人解决问题的方法,而不是仅仅把它放在这里等待响应。我最后的评论是以最好的方式来表示的,我道歉,如果它看起来不是这样的话。我现在使用你的建议。如果这真的是唯一的方法来实现它,那么我认为它是一个不一致的<代码> EnUM类< /Cord>在C++中的实现。r解释。我不认为编译器能够保证var1 | var2的结果在枚举中是有效的值,因为var1和var2可以包含任何值。为了可读性,我也想将var3声明为某种状态,这就是为什么我需要运算符重载。此外,#define“annotation”枚举包含标志。谢谢为了解释。我认为编译器无法保证var1 | var2的结果在枚举中是有效的值,因为var1和var2可以包含任何值。为了可读性,我也想将var3声明为某种状态,这就是为什么我需要运算符重载。此外,#define“annotation”枚举包含标志。这是GPL,所以我不能在我们的商业程序中使用它。很抱歉,我不清楚这一点。为enum编写包装类(enum数组作为索引,位作为值)非常简单,而且更安全(也更优雅)而不是使用原始枚举。这是GPL,所以我不能在我们的商业程序中使用它。很抱歉不清楚这一点。为枚举编写包装类(枚举数组作为索引,位作为值)非常简单,而且更安全(也更优雅)而不是使用原始枚举。请看一下最近的讨论:,。也请看@RMartinhoFernandes的讨论:,。也请看@RMartinhoFernandes的讨论