美文网首页
如何写可以组合的enum

如何写可以组合的enum

作者: 诸事圆成 | 来源:发表于2023-03-14 13:35 被阅读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 中
}

相关文章

  • 奇妙的enum class,enum struct组合

    奇妙的enum class,enum struct组合 在c++11标准中,除了传统的enum关键字之外, 还新增...

  • C++11——专业工具和技术

    范围enum(Scoped enum) 枚举使我们可以将一组整型常量组合在一起。与类一样,每个枚举定义一个新类型。...

  • ★16.枚举类型

    Enum 简介 enum不能被继承。 enum的构造函数自动为私有。 除了以上两点,enum与类相同。 可以通过以...

  • Java编程思想---枚举类型

    Java编程思想---枚举类型 基本enum特性 调用enum的values()方法,可以遍历enum实例,val...

  • Swift中Enum的使用姿势

    Swift的Enum类型可以存储值 enum iOSDeviceSystemType {case iPhone(S...

  • java enum关键字

    为什么思考enum关键字 在思考enum之前,同事问了我关于enum的两个问题: enum 类可以继承吗? vo里...

  • java中WAITING状态的线程为啥还会消耗CPU

    public static enum Thread.Stateextends Enum 线程状态。线程可以处于下列...

  • Enum 类型转化

    enum & int enum -> int: int -> enum: enum & String enum -...

  • 枚举

    反向映射 我们可以通过 Enum[key] 或者 Enum.key 的方式获取到对应的值。typescript 还...

  • Mybatis Enum处理

    通过Enum往数据库中添加数据默认在数据库中保存的是Enum的name。如果要保存Enum的value,可以通过改...

网友评论

      本文标题:如何写可以组合的enum

      本文链接:https://www.haomeiwen.com/subject/kexkrdtx.html