为啥不能在位和中使用作用域枚举?

Posted

技术标签:

【中文标题】为啥不能在位和中使用作用域枚举?【英文标题】:Why isn't possible to use scoped enum in a bitwise and?为什么不能在位和中使用作用域枚举? 【发布时间】:2014-05-02 09:22:36 【问题描述】:

我将宏(很糟糕,让小孩子害怕,就像 Google said)切换到范围枚举。我认为有范围枚举很棒。然后我写了这个:

if ((msg.Stamp & RECEIVERS::BROADCAST) != RECEIVERS::BROADCAST)
                 ^^^^^^^^^^^^^^^^^^^^
//do stuff

并且智能感知给了我一个奇怪的错误,例如:“表达式必须具有整数类型或无范围的枚举”。为什么我不能按位和范围枚举?

【问题讨论】:

***.com/questions/8357240/… 【参考方案1】:

可以,但必须自己编写运算符重载

RECEIVERS operator&(RECEIVERS l, RECEIVERS r)

  using underlying = typename std::underlying_type<RECEIVERS>::type;
  return static_cast<RECEIVERS>(static_cast<underlying>(l) & static_cast<underlying>(r));

内置二进制operator&amp; 仅适用于整数类型和无作用域枚举类型。作用域枚举类型对如何使用它们有限制,它们的行为不像整数,因此(默认情况下)它们只支持有限的一组操作。

除此之外:类型名称RECEIVERS 对我来说看起来很可怕,Receivers 有什么问题?我不喜欢将 ALL_CAPS 用于枚举器常量的约定,但我更不喜欢它作为类型名称。

【讨论】:

好的,非常感谢。另外,正如@ctor 指出的那样,我没有看到上一个问题。如果可以的话,我会删除这个问题。 有一个普遍的约定,即所有大写字母都表示一个宏。同意乔纳森的建议,我说不要违反这个约定。 我故意避免回答这个问题,因为我认为人们在命名约定上花费了太多时间。这只是一个约定。如果它是一致的,bla bla bla,最重要的是让我感到舒服,我看不出问题出在哪里。把它传过去。 :) 而且,根据我从这个问题的理解,我不再使用作用域枚举了:问题解决了。 :) 良好的命名约定很有用(“计算机科学中只有两件难事:缓存失效和命名。” -- Phil Karlton)。宏不尊重命名空间或其他范围,因此宏的命名约定更为重要。为宏保留 ALL_CAPS 有助于避免错误。此外,ALL_CAPS 又丑又吵,为什么要让常量从其余代码中脱颖而出?常量很无聊,它们不值得关注。宏值得关注。

以上是关于为啥不能在位和中使用作用域枚举?的主要内容,如果未能解决你的问题,请参考以下文章

将作用域枚举转换为 int

面向对象

enum class 和 enum比较

C语言速记3(作用域,枚举)

隐藏域是干啥东东 有啥作用 为啥有的网页上经常用到 如何使用

是否可以确定一个类型是否是作用域枚举类型?