为啥不能在位和中使用作用域枚举?
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&
仅适用于整数类型和无作用域枚举类型。作用域枚举类型对如何使用它们有限制,它们的行为不像整数,因此(默认情况下)它们只支持有限的一组操作。
除此之外:类型名称RECEIVERS
对我来说看起来很可怕,Receivers
有什么问题?我不喜欢将 ALL_CAPS 用于枚举器常量的约定,但我更不喜欢它作为类型名称。
【讨论】:
好的,非常感谢。另外,正如@ctor 指出的那样,我没有看到上一个问题。如果可以的话,我会删除这个问题。 有一个普遍的约定,即所有大写字母都表示一个宏。同意乔纳森的建议,我说不要违反这个约定。 我故意避免回答这个问题,因为我认为人们在命名约定上花费了太多时间。这只是一个约定。如果它是一致的,bla bla bla,最重要的是让我感到舒服,我看不出问题出在哪里。把它传过去。 :) 而且,根据我从这个问题的理解,我不再使用作用域枚举了:问题解决了。 :) 良好的命名约定很有用(“计算机科学中只有两件难事:缓存失效和命名。” -- Phil Karlton)。宏不尊重命名空间或其他范围,因此宏的命名约定更为重要。为宏保留 ALL_CAPS 有助于避免错误。此外,ALL_CAPS 又丑又吵,为什么要让常量从其余代码中脱颖而出?常量很无聊,它们不值得关注。宏值得关注。以上是关于为啥不能在位和中使用作用域枚举?的主要内容,如果未能解决你的问题,请参考以下文章