如何写可以组合的enum

2023-03-14  本文已影响0人  诸事圆成

枚举要使用2的幂

原理:确保每个枚举值在二进制表示中都只有一个位被设置为1。这种表示方法允许我们使用按位或(|)操作来组合不同的枚举值,而不会出现重叠或覆盖现象。换句话说,这样我们可以在一个变量中同时表示多个选项。我们可以看到通过按位或操作组合了选项2(二进制0010)和选项4(二进制0100),得到了一个新的值6(二进制0110),这个值同时表示选项2和选项4。由于每个选项都有一个唯一的位设置为1,我们可以清楚地识别出哪些选项被组合在一起。

0001 //2^0 = 1
0010 //2^1 = 2
0100 //2^2 = 4
1000 //2^3 = 8
0010 (2)   // Option 2
0100 (4)   // Option 4
-------
0110 (6)   // Combination of Option 2 and Option 4

Q_DECLARE_FLAGS 宏用于声明一个标志类型(flags type),它基于已定义的枚举类型。标志类型是一种可以存储枚举类型值的组合(通过按位或操作组合)的类型。这允许您在一个变量中存储多个枚举值,并在需要时检查这些值的存在。

例子

#include <QObject>

class FileAccess : public QObject
{
    Q_OBJECT

public:
    enum class FileMode {
        ReadOnly = 0x1,
        WriteOnly = 0x2,
        ReadWrite = ReadOnly | WriteOnly,
        Append = 0x4
    };
    Q_ENUM(FileMode)

    // ...
};

Q_DECLARE_FLAGS(FileModes, FileAccess::FileMode)  //FileModes modes = FileAccess::FileMode::ReadWrite | FileAccess::FileMode::Append;
Q_DECLARE_OPERATORS_FOR_FLAGS(FileModes) //用于转为Qvariant

要检查 modes 是否包含特定的模式,可以使用按位与操作(&)

if (modes & FileAccess::FileMode::ReadOnly) {
    // ReadOnly 模式存在于 modes 中
}

if (modes & FileAccess::FileMode::Append) {
    // Append 模式存在于 modes 中
}

上一篇 下一篇

猜你喜欢

热点阅读