【问题标题】:What's the easiest way to set bit flags in an enum?在枚举中设置位标志的最简单方法是什么?
【发布时间】:2021-08-21 18:36:32
【问题描述】:

我正在尝试这样做,而且这样做很乏味。

enum class GUIEventEnum : uint64 {
    NONE = 0,
     
    CURSOR_LMB_DOWN = 1 << 1, 
    CURSOR_LMB_UP = 1 << 2,
    CURSOR_LMB_CLICK = 1 << 3,
    CURSOR_RMB_DOWN = 1 << 4,
    CURSOR_RMB_UP = 1 << 5,
    CURSOR_RMB_CLICK = 1 << 6,
    CURSOR_MMB_DOWN = 1 << 7,
    CURSOR_MMB_UP = 1 << 8,
    CURSOR_MMB_CLICK = 1 << 9,
    CURSOR_SCROLL = 1 << 10,
};

而且还会有更多。有没有办法我可以在列表中声明它?像枚举?

【问题讨论】:

  • 如果您希望枚举常量具有特定值(不遵循枚举默认使用的方案),那么您必须明确指定值。
  • 根据用例,您可以创建一个包装 uint64_t 并在需要时分配标志(在 static map 中)的类,这将规避此问题,但它不会是枚举到那时。
  • 抽象它?如果您的“标志”是一个类对象,您可以嵌套(顺序)枚举器并重载operator| 以执行1 &lt;&lt; E,然后再应用基本的按位或。
  • 毕竟,如果您使用范围枚举,则无论如何都必须进行大量重载(或大量强制转换)。
  • "还会有更多。" 如果这是真的,也许位域不是您所需要的。也许您只需要发送多个事件,每个事件都有自己的值。

标签: c++ enums


【解决方案1】:

如果每个枚举器都有自己的位,那么您可以编写一个constexpr 函数来计算相关枚举器的位:

constexpr inline std::uint64_t event_bit(GUIEventEnum e)
{
  return 0x1 << static_cast<std::uint64_t>(e);
}

【讨论】:

    猜你喜欢
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多