【枚举】:复合态的处理( Flag = Flag1 | Flag2 )

news2024/9/27 19:25:08

一、引言

枚举 enum是我们用的比较多的类型,而枚举通常适用的场景,也是为了我们在业务逻辑处理时,作为不同的逻辑分支的判断条件;比起直接定义1~N这样魔幻到让人一头雾水的分支 Flag , 定义完美的枚举类型可以见名知意,简直不要太优雅。
但是,我们偶尔也会面临这样的分支选择,我既要执行状态A,还要执行状态B,(好看的姑娘当然都要,小孩子才做选择),那么,在使用枚举作为分支条件时,该如何处理呢?
以下,抛砖引玉,给出简单的示例。

二、代码示例

1、简单版本

#include <iostream>

// 定义位掩码枚举
enum class MultiState : unsigned int {
    NONE      = 0,
    STATE1    = 1 << 0, // 0001
    STATE2    = 1 << 1, // 0010
    STATE3    = 1 << 2, // 0100
    STATE4    = 1 << 3  // 1000
};

// 定义位运算符重载
inline MultiState operator|(MultiState a, MultiState b) {
    return static_cast<MultiState>(static_cast<unsigned int>(a) | static_cast<unsigned int>(b));
}

inline MultiState& operator|=(MultiState& a, MultiState b) {
    a = a | b;
    return a;
}

inline bool operator&(MultiState a, MultiState b) {
    return static_cast<bool>(static_cast<unsigned int>(a) & static_cast<unsigned int>(b));
}

void printMultiState(MultiState state) {
    if (state & MultiState::STATE1) std::cout << "STATE1 ";
    if (state & MultiState::STATE2) std::cout << "STATE2 ";
    if (state & MultiState::STATE3) std::cout << "STATE3 ";
    if (state & MultiState::STATE4) std::cout << "STATE4 ";
    if (state == MultiState::NONE) std::cout << "NONE";
    std::cout << std::endl;
}

int main() {
    MultiState state = MultiState::STATE1 | MultiState::STATE3;
    printMultiState(state);

    state |= MultiState::STATE2;
    printMultiState(state);
    
    return 0;
}

在这里插入图片描述
如果有试图问 enum class MultiState 语法的朋友,请前往《为何推荐首选enum class 而非 enum》

这里有巧妙使用位运算,保证复合态值的唯一,并在判断每个态是否为真时,起到关键的作用;不过缺点也很明显,如果枚举类型的值很多,


void printMultiState(MultiState state) {
    if (state & MultiState::STATE1) std::cout << "STATE1 ";
    if (state & MultiState::STATE2) std::cout << "STATE2 ";
    if (state & MultiState::STATE3) std::cout << "STATE3 ";
    if (state & MultiState::STATE4) std::cout << "STATE4 ";
    if (state == MultiState::NONE) std::cout << "NONE";
    std::cout << std::endl;
}

这里 if ... else ...岂不是要写到死?这肯定是不能接受的。

2、进阶版本

#include <iostream>
#include <vector>

// 定义位掩码枚举
enum class MultiState : unsigned int {
    NONE      = 0,
    STATE1    = 1 << 0, // 0001
    STATE2    = 1 << 1, // 0010
    STATE3    = 1 << 2, // 0100
    STATE4    = 1 << 3, // 1000
    // 添加更多状态
    STATE5    = 1 << 4,
    STATE6    = 1 << 5,
    // ...
};

// 定义位运算符重载
inline MultiState operator|(MultiState a, MultiState b) {
    return static_cast<MultiState>(static_cast<unsigned int>(a) | static_cast<unsigned int>(b));
}

inline MultiState& operator|=(MultiState& a, MultiState b) {
    a = a | b;
    return a;
}

inline bool operator&(MultiState a, MultiState b) {
    return static_cast<bool>(static_cast<unsigned int>(a) & static_cast<unsigned int>(b));
}

// 定义状态和字符串表示的结构体
struct StateInfo {
    MultiState state;
    const char* name;
    // std::function<void()> f;
};

// 定义状态和字符串表示的数组
const StateInfo stateInfos[] = {
    { MultiState::STATE1, "STATE1" },
    { MultiState::STATE2, "STATE2" },
    { MultiState::STATE3, "STATE3" },
    { MultiState::STATE4, "STATE4" },
    { MultiState::STATE5, "STATE5" },
    { MultiState::STATE6, "STATE6" },
    // 添加更多状态
};

void printMultiState(MultiState state) {
    bool hasState = false;
    for (const auto& info : stateInfos) {
        if (state & info.state) {
            std::cout << info.name << " ";
            hasState = true;
        }
    }
    if (!hasState) {
        std::cout << "NONE";
    }
    std::cout << std::endl;
}

int main() {
    MultiState state = MultiState::STATE1 | MultiState::STATE3;
    printMultiState(state);

    state |= MultiState::STATE2;
    printMultiState(state);

    return 0;
}

这次高级点,用循环处理复合态;当然这里定义StateInfo 结构体中可以增加对应每个enum处理的函数指针变量,并在for循环中调用,岂不美哉~

这可不就是由处理复合枚举类型,而衍生的一个简单优雅的小框架了么~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

六西格玛培训应该采用什么方式?

六西格玛&#xff0c;作为一套被全球顶尖企业广泛采用的管理哲学和方法论&#xff0c;无疑是帮助企业实现这一目标的强有力工具。那么&#xff0c;如何有效开展六西格玛培训&#xff0c;让这一理念深入人心&#xff0c;成为每位员工日常工作中的自觉行动呢&#xff1f;深圳天行…

双算法https证书获取指南

双算法HTTPS证书&#xff0c;同时支持国际主流算法&#xff08;如RSA、ECC&#xff09;和国密算法&#xff08;如SM2、SM3、SM4&#xff09;的SSL证书。这种证书能够在保证数据安全性的同时&#xff0c;满足不同用户群体和浏览器的需求。 以下是获取双算法HTTPS证书的详细指南…

坚果云,文件夹同步冲突、共享文件夹权限提示文件已共享实际查看不到

一、提示冲突 打开注册表 1、按下面的路径\HKEYLOCALMACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager\看是否有 【Nutstore-临时】开头的项 和【Nutstore-通知】开头的项。如果有&#xff0c;删掉这两项就好了。 2、重新同步文件夹就可以了 二…

几种出现错误:找不到mfc140u.dll,无法继续执行代码是什么情况?

在使用电脑的时候&#xff0c;你的电脑是否突然出现关于&#xff1a;“找不到mfc140u.dll,无法继续执行代码”的提示&#xff0c;那么出现这样的提示有什么办法可以将找不到mfc140u.dll的问题进行解决呢&#xff1f;接下来就和大家聊聊如何将丢失的mfc140u.dll问题修复的方法。…

『Python学习笔记』Python环境管理器—Poetry入门指南

Python环境管理器—Poetry入门指南 文章目录 一. 基础知识1. Poetry是什么&#xff1f;2. 名词解释&#xff1a;虚拟环境管理、模块管理、模块依赖管理3. pip的不足 二. 从零开始使用Poetry1. 安装Poetry2. 初始化Poetry3. 管理Poetry 虚拟环境4. 修改config&#xff0c;建立专…

1区SCI,录用仅需2个月!国人发文量位居第二,超低版面费,毕业评职的救命神刊!

关注GZH【欧亚科睿学术】&#xff0c;第一时间了解期刊最新动态&#xff01; &#x1f525; &#x1f525; &#x1f525; &#x1f525; 中科院2区SCI&#xff0c;2个月即录用&#xff01; 《Journal of King Saud University-Computer and Information Sciences》是一…

给python初学者的一些建议

写在开篇 关于Python&#xff0c;可以这么说&#xff0c;这几年借着数据科学、机器学习与人工智能的东风&#xff0c;Python 老树开新花&#xff0c;在风口浪尖上居高不下。 Python 之所以这么受大家的青睐&#xff0c;是因为它语言简洁&#xff0c;上手容易&#xff0c;让非…

网络安全4

一. 查找网络漏洞的两种方式 1. CMS源码网站 很多网站在搭建的时候会使用网上的源码模板(可能是php&#xff0c;arp等等)&#xff0c;当我们找到cms之后就可以在网上搜索对应cms漏洞从而发现漏洞。或者下载对应cms源码到本地对源码白盒测试 如何判断网站cms 比如&#xff1a;…

股指期货交易中的MACD指标应用指南

在期货市场中&#xff0c;技术分析是投资者把握市场动向、做出交易决策的重要工具。技术指标众多&#xff0c;但没有绝对准确的指标&#xff0c;关键在于如何合理运用。本文将详细介绍MACD指标&#xff0c;帮助投资者更好地理解和运用这一工具。 一、什么是MACD指标&#xff1…

【Material-UI】Autocomplete 组件中的虚拟化功能(Virtualization)详解

文章目录 一、虚拟化概述二、实现虚拟化的步骤1. 引入依赖2. 自定义 Popper 组件和 Listbox 组件3. 代码详解4. 性能优化 三、实际应用场景1. 大规模数据列表2. 高性能需求的应用 四、总结 在现代 Web 开发中&#xff0c;处理大量数据时&#xff0c;性能优化显得尤为重要。Mate…

企业级OV通配符/泛域名https证书申请

企业网站如果要申请HTTPS证书&#xff0c;那么OV通配符/泛域名https证书是一个相当合适的选择。企业级 OV 通配符/泛域名证书是一种 SSL/TLS 证书类型&#xff0c;为主域名及其所有二级子域名提供安全连接。 申请 OV 通配符 SSL 证书&#xff0c;您通常需要遵循以下步骤&#x…

机器学习之主成分分析(PCA)

机器学习之主成分分析&#xff08;PCA&#xff09; 1. PCA的数学基础1.1 线性代数基础1.1.1 向量与矩阵的表示1.1.2 矩阵的特征值与特征向量 1.2 协方差矩阵1.2.1 定义与性质1.2.2 在PCA中的作用 2. PCA的理论概述2.1 主成分的定义2.1.1 方差最大化的原则2.1.2 正交性与主成分正…

[图解]SysML建模电磁轨道炮-01块定义图

1 00:00:00,490 --> 00:00:04,000 我们是用EA复刻一个网络上的案例 2 00:00:06,370 --> 00:00:09,240 电磁轨道炮&#xff0c;它的原理很简单 3 00:00:09,490 --> 00:00:10,960 初中物理就可以理解 4 00:00:11,670 --> 00:00:14,010 首先&#xff0c;电流形成磁…

How to get headers from OpenAI API

题意&#xff1a;怎样从OpenAI API获取响应头&#xff08;Headers&#xff09; 问题背景&#xff1a; I am relatively new to the OpenAI API and am trying to obtain my rate limits through the HTTP headers of the response, as discussed https://platform.openai.com/…

Markdown插入Base64格式的图片,无需图床,稳定保存

Markdown插入Base64格式的图片&#xff0c;无需图床&#xff0c;稳定保存 我是一个Markdown的爱好者&#xff0c;转存图片是MD经常出问题的地方&#xff0c;因为MD不像其他富文本编辑器&#xff0c;将图片内嵌到文件中&#xff0c;而是用链接的形式引用&#xff0c;或网络链接…

【复旦微FM33 MCU 外设开发指南】系统篇——时钟

前言 本系列基于复旦微FM33系列单片机的DataSheet编写&#xff0c;旨在提供一些开发指南。 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转↓↓↓ 【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期&#xff1a;2024/08/04 文章目录 前言时钟源…

视频作为现实世界决策制定的新语言

人工智能咨询培训老师叶梓 转载标明出处 在互联网上&#xff0c;视频和文本数据同样丰富&#xff0c;它们支持通过预测下一个词或帧来进行大规模自监督学习。然而视频数据并没有象文本数据那样被充分利用&#xff1a;语言模型已经在现实世界产生了显著影响&#xff0c;而视频生…

命令行参数、环境变量详解

目录 一、命令行参数&#xff1a; 二、环境变量PATH 1、理解什么是环境变量 2、常见环境变量和操作 3、整体理解环境变量&#xff0c;系统&#xff0c;程序 4、如何获取环境变量(c语言&#xff09; &#xff08;1&#xff09;getenv() 函数 &#xff08;2&#xff09;使…

uniapp(scroll-view)设置show-scrollbar无效

一、描述 在uniapp中&#xff0c;使用scroll-view内置组件&#xff0c;我这里是把他弄成一个可以滑动的导航&#xff0c;设置show-scrollbar"false"之后&#xff0c;按道理来说应该可以了&#xff0c;这个官方提供的一个属性可以不显示滑动条。但是&#xff0c;发现&…

影响气动小流量调节阀EMC测试价格因素是什么

气动小流量调节阀是一种顶导向单阀座调节阀&#xff0c;具有结构简单、密封性能好、使用可靠等特点。有效而足够的顶部导向系统克服小开度时的震动&#xff0c;有效使用寿命更长。气动小流量调节阀流量系数KV值从1.0到10-5的称为小流量调节阀&#xff0c;当Kv≤210-2时&#xf…