【问题标题】:Using enum flags in C++ [duplicate]在 C++ 中使用枚举标志 [重复]
【发布时间】:2012-09-14 19:13:56
【问题描述】:

可能重复:
How to use enums as flags in C++?

为了解释我想要做什么,我试图获取一个包含更新检查信息的标志整数,例如

int flags = keyPress | mouseClick | mouseMove; 

来自我的事件枚举;

enum mEvents {
     keyPress = QEvent::KeyPress,
     keyRelease = QEvent::KeyRelease,
     mouseClick = QEvent::MouseButtonPress,
     mouseDoubleClick = QEvent::MouseButtonDblClick,
     mouseMove = QEvent::MouseMove
};

这样我就可以检查发生了哪些事件类型;

void Lib::Update(QEvent *e) {
     if (e->type() == flags)
         stateManager->updateCurrentState(e);
}

我要做的是说,如果事件类型是“标志”中的以下任何一种,则更新。但是,这是行不通的。更准确地说,它适用于按键,但不适用于鼠标点击或移动事件。

所以我想知道,我想做的事情是否可能,如果可以,我该如何实现? (我很确定,我知道 SDL 使用类似的标志系统来创建屏幕) 非常感谢任何帮助。)

【问题讨论】:

  • 这不是它的工作原理。在这种情况下,您需要每次使用该方法中的每个值检查事件类型。你所做的一切——复制了另一个枚举(QEvent::Type)的一部分。只有当枚举的每个元素都具有每字节值(0x1、0x2、0x4、0x8、0x10 等)时,您的想法才有效。列出的项目没有这样的值。

标签: c++ qt enumeration flags


【解决方案1】:

来自here 的枚举值。

QEvent::KeyPress = 6 = 0x0110

QEvent::KeyRelease = 7 = 0x0111

QEvent::NonClientAreaMouseButtonPress = 174 = 0x10101110

QEvent::MouseButtonDblClick = 4 = 0x0100

QEvent::MouseMove = 5 = 0x0101

注意这些是如何按位排列的:

0x00000110

0x00000111

0x10101110

0x00000100

0x00000101

为此,您的所有标志都必须至少有一个不被其他标志共享的位。请注意

0x10101110 | 0x00000110 = 0x10101110 本身就是第一个标志。

所以:

QEvent::NonClientAreaMouseButtonPress | QEvent::KeyPress

和单纯的没有区别:

QEvent::NonClientAreaMouseButtonPress

【讨论】:

    【解决方案2】:

    对,因为如果你看the documentation,那些枚举值并不是所有的 2 的幂,所以你不能将它们用作位标志(嗯,你可以,它只是赢了如果任何位重叠,则不起作用)。

    您只是在复制QEvent 中定义的枚举,所以我真的完全看不出重点。您必须单独检查每种类型,它们不会以不同值的组合出现。

    【讨论】:

    • 重点是尝试获取/找到一种方法来获得额外的灵活性,以检查可能导致更新的原因。 IE。一种状态根本不能使用双击,而另一种状态可以。我想尝试并控制它,而不需要我自己改变它。
    • 不太对。枚举值需要按位独立。
    • @mydogisbox:你是在跟我说话还是在说丹然?
    • @EdS。你。关键是 0x1100 和 0x0011 对标志来说很好,因为它们没有重叠。
    • @EdS。还是不太对。还有其他适合标志的位组合。当特定标志没有至少一个唯一位时,就会出现问题。
    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    相关资源
    最近更新 更多