“深入浅出”系列之C++:(15)simple_enum库

在C++ 开发中,枚举类型是一种常用的数据类型,它允许我们定义一组命名的整型常量。然而,传统的C++ 枚举类型存在一些局限性,而simple_enum 工具的出现,有效地解决了这些问题,为开发者提供了更强大、更便捷的枚举处理方式。

一、simple_enum的主要功能

1. 字符串与枚举值的双向转换

simple_enum 支持字符串和枚举值之间的双向转换。在传统的C++ 枚举中,如果要将枚举值转换为对应的字符串,需要手动编写大量的代码来实现映射关系。而simple_enum 可以自动生成这种映射关系,极大地减少了开发工作量。例如,我们定义一个表示星期的枚举:

#include <simple_enum/simple_enum.hpp>

SIMPLE_ENUM(Weekday,
    (Sunday)
    (Monday)
    (Tuesday)
    (Wednesday)
    (Thursday)
    (Friday)
    (Saturday)
);

通过simple_enum 定义的枚举,我们可以轻松地进行字符串和枚举值的转换:

#include <iostream>

int main() {
    Weekday day = Weekday::Monday;
    std::string day_str = to_string(day);
    std::cout << "The string representation of Monday is: " << day_str << std::endl;

    Weekday parsed_day = from_string<Weekday>("Tuesday");
    std::cout << "The enum value of Tuesday is: " << static_cast<int>(parsed_day) << std::endl;

    return 0;
}

2. 枚举值的遍历

simple_enum 还提供了方便的枚举值遍历功能。在处理一些需要对所有枚举值进行操作的场景时,这一功能尤为有用。例如,我们可以遍历所有的星期枚举值,并输出它们的字符串表示:

#include <iostream>

int main() {
    for (const auto& day : all_values<Weekday>()) {
        std::string day_str = to_string(day);
        std::cout << "Day: " << day_str << std::endl;
    }

    return 0;
}

3. 支持自定义属性

simple_enum 允许为枚举值定义自定义属性。这一功能在一些需要为枚举值附加额外信息的场景中非常实用。例如,我们可以为每个星期枚举值定义一个对应的休假标志:

#include <simple_enum/simple_enum.hpp>

SIMPLE_ENUM(Weekday,
    (Sunday, true)
    (Monday, false)
    (Tuesday, false)
    (Wednesday, false)
    (Thursday, false)
    (Friday, false)
    (Saturday, true)
);

auto is_holiday(Weekday day) {
    return get_attribute<1>(day);
}

二、simple_enum的特点

1. 简洁易用

simple_enum 的语法非常简洁,通过宏定义的方式,开发者可以快速定义具有丰富功能的枚举类型。与手动实现字符串和枚举值转换、枚举值遍历等功能相比,使用simple_enum 大大减少了代码量,降低了开发难度。

2. 类型安全

simple_enum 基于C++ 的模板元编程技术实现,在编译期完成大部分的工作,保证了类型安全。例如,在进行字符串到枚举值的转换时,如果输入的字符串与任何枚举值都不匹配,编译器会报错,避免了运行时错误。

3. 可扩展性

simple_enum 具有良好的可扩展性,开发者可以根据自己的需求为枚举类型添加更多的功能。例如,通过继承和模板特化,可以为特定的枚举类型实现自定义的转换函数或其他操作。

4. 跨平台支持

simple_enum 是一个纯头文件库,不依赖于特定的操作系统或编译器,具有良好的跨平台支持性。无论是在Windows、Linux 还是MacOS 等操作系统上,只要是支持C++11 及以上标准的编译器,都可以使用simple_enum

三、simple_enum的使用示例

示例1:基本的枚举定义与使用

#include <simple_enum/simple_enum.hpp>
#include <iostream>

// 定义一个表示颜色的枚举
SIMPLE_ENUM(Color,
    (Red)
    (Green)
    (Blue)
);

int main() {
    Color color = Color::Green;
    std::string color_str = to_string(color);
    std::cout << "The string representation of Green is: " << color_str << std::endl;

    Color parsed_color = from_string<Color>("Blue");
    std::cout << "The enum value of Blue is: " << static_cast<int>(parsed_color) << std::endl;

    return 0;
}

示例2:结合自定义属性的使用

#include <simple_enum/simple_enum.hpp>
#include <iostream>

// 定义一个表示水果的枚举,并为每个枚举值添加价格属性
SIMPLE_ENUM(Fruit,
    (Apple, 5)
    (Banana, 3)
    (Orange, 4)
);

auto get_price(Fruit fruit) {
    return get_attribute<1>(fruit);
}

int main() {
    Fruit fruit = Fruit::Banana;
    int price = get_price(fruit);
    std::cout << "The price of Banana is: " << price << " yuan" << std::endl;

    return 0;
}

示例3:枚举值的遍历与操作

#include <simple_enum/simple_enum.hpp>
#include <iostream>

// 定义一个表示季节的枚举
SIMPLE_ENUM(Season,
    (Spring)
    (Summer)
    (Autumn)
    (Winter)
);

// 为每个季节定义一个描述信息
const std::string season_descriptions[] = {
    "It's a season of rebirth and growth.",
    "The weather is hot and sunny.",
    "The leaves turn golden and fall.",
    "It's cold and often snowy."
};

int main() {
    for (constauto& season : all_values<Season>()) {
        std::string season_str = to_string(season);
        std::cout << "Season: " << season_str << ", Description: " << season_descriptions[static_cast<int>(season)] << std::endl;
    }

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux 源码】内核态到用户态

文章目录 1. 由来2. 流程图3. 中断3.1 概念3.2 8259A芯片3.4 中断时的栈处理3.4.1 相同特权级3.4.2 不同特权级 3.5 中断流程3.6 定位中断程序3.7 中断流程步骤总结 4. 源码4.1 move_to_user_mode4.2 0号进程4.3 TSS和LDT在GDT表排布4.4 ldt中的0x17栈段 5. 总结 1. 由来 ​ 首…

SparkSQL数据模型综合实践

文章目录 1. 实战概述2. 实战步骤2.1 创建数据集2.2 创建数据模型对象2.2.1 创建常量2.2.2 创建加载数据方法2.2.3 创建过滤年龄方法2.2.4 创建平均薪水方法2.2.5 创建主方法2.2.6 查看完整代码 2.3 运行程序&#xff0c;查看结果 3. 实战小结 1. 实战概述 在本次实战中&#…

通过电光晶体的电光效应,实现白光干涉中的电光调制相移原理

通过电光晶体的电光效应&#xff0c;实现白光干涉中的电光调制相移原理&#xff0c;是一个基于物理光学和电光学原理的高级测量技术。以下是对这一原理的详细解释&#xff1a; 一、电光效应与电光晶体 电光效应是指某些材料&#xff08;主要是晶体&#xff09;在外加电场的作…

基于Python的多元医疗知识图谱构建与应用研究(上)

一、引言 1.1 研究背景与意义 在当今数智化时代,医疗数据呈爆发式增长,如何高效管理和利用这些数据,成为提升医疗服务质量的关键。传统医疗数据管理方式存在数据孤岛、信息整合困难等问题,难以满足现代医疗对精准诊断和个性化治疗的需求。知识图谱作为一种知识表示和管理…

logback日志自定义占位符

前言 在大型系统运维中&#xff0c;很大程度上是需要依赖日志的。在java大型web工程中&#xff0c;一般都会使用slf4jlogback这一个组合来实现日志的管理。 logback中很多现成的占位符可以可以直接使用&#xff0c;比如线程号【%t】、时间【%d】、日志等级【%p】&#xff0c;…

嵌入式知识点总结 C/C++ 专题提升(一)-关键字

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.C语言宏中"#“和"##"的用法 1.1.(#)字符串化操作符 1.2.(##)符号连接操作符 2.关键字volatile有什么含意?并举出三个不同的例子? 2.1.并行设备的硬件寄存…

嵌入式Linux驱动开发之platform

关键词&#xff1a;rk3399 嵌入式驱动 Linux platform 前言 前面的嵌入式Linux驱动都是描述从特定的SOC与特定设备之间的直接两两通信。而Linux不是为单一某一SOC结构而设计的操作系统&#xff0c;它可以运行在X86、ARM等多种架构多种SOC平台上&#xff0c;如果驱动程序按照S…

KubeSphere部署安装,接入KubeKey安装的k8s集群

KubeSphere安装接入KubeKey安装的k8s集群 文章目录 KubeSphere安装接入KubeKey安装的k8s集群 一.NFS安装配置1.服务器安装NFS服务2.下载并部署 NFS Subdir External Provisioner1).下载部署文件2).创建 NameSpace3).创建 RBAC 资源4).配置 deployment.yaml5).部署 Storage Clas…

从密码学原理与应用新方向到移动身份认证与实践

相关学习资料放下面啦&#xff01; 记得关注❤️&#xff5e;后续分享更多资料 通过百度网盘分享的文件&#xff1a;从密码学原理与应... 链接https://pan.baidu.com/s/1mHpHkvPuf8DUwReQkoYQlw?pwdGza7 提取码&#xff1a;Gza7 复制这段内容打开「百度网盘APP 即可获取」 记…

Java 特殊文件、 properties文件、xml文件

一. 属性文件.properties 1. #注释 2. 内容都是一些键值对信息&#xff0c;每行都是一个键值对&#xff1b;键不能重复&#xff1b; 3. 属性文件的后缀一般都是properties结尾 4. 使用程序读取properties属性文件里面的数据 (1) Properties&#xff1a;是一个Map集合(键值对集合…

抽象设计如何提升用户体验?

抽象设计在网页设计中可以通过多种方式提升用户体验&#xff0c;以下是具体的应用和作用&#xff1a; 一、增强视觉吸引力 视觉冲击力&#xff1a;抽象元素往往具有强烈的视觉冲击力&#xff0c;能够迅速吸引用户的注意力。通过大胆的色彩、不寻常的形状和丰富的纹理&#xff…

MATLAB中while循环例子,for循环嵌套例子

while循环例子 for循环解决斐波那契数列 for循环嵌套例子 注意最后都有 e n d end end

行人识别检测数据集,yolo格式,PASICAL VOC XML,COCO JSON,darknet等格式的标注都支持,准确识别率可达99.5%

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…

【vitePress】基于github快速添加评论功能(giscus)

一.添加评论插件 使用giscus来做vitepress 的评论模块&#xff0c;使用也非常的简单&#xff0c;具体可以参考&#xff1a;giscus 文档&#xff0c;首先安装giscus npm i giscus/vue 二.giscus操作 打开giscus 文档&#xff0c;如下图所示&#xff0c;填入你的 github 用户…

JAVA使用自定义注解,在项目中实现EXCEL文件的导出

首先定义一个注解 Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD) public interface Excel {/*** 导出时在excel中排序*/int sort() default Integer.MAX_VALUE;/*** 导出到Excel中的名字.*/String name() default "";/*** 首行字段的批注*/String …

有限元分析学习——Anasys Workbanch第一阶段笔记(14)静定与超静定问题、约束类型介绍、简支梁挠度求解和自定义材料库建立

目录 0 序言 1 静定与超静定问题 2 Workbranch中Supports介绍 3 简支梁挠度的有限元求解 4 自定义材料库建立 0 序言 静定与超静定问题、约束类型介绍、简支梁挠度求解和自定义材料库建立(内容对应视频22到24课)。 1 静定与超静定问题 在有限元分析中&#xff0c;不同的…

领域算法 - 大数据处理

大数据处理 文章目录 大数据处理一&#xff1a;hash分流二&#xff1a;双层桶1&#xff1a;什么是双层桶2&#xff1a;双层桶案例 三&#xff1a;外排序1&#xff1a;经典问题2&#xff1a;位图排序法3&#xff1a;多路归并排序 四&#xff1a;bitMap1&#xff1a;添加 -> 异…

以太网实战AD采集上传上位机——FPGA学习笔记27

一、设计目标 使用FPGA实现AD模块驱动采集模拟电压&#xff0c;通过以太网上传到电脑上位机。 二、框架设计 数据位宽转换模块&#xff08;ad_10bit_to_16bit&#xff09;&#xff1a;为了方便数据传输&#xff0c;数据位宽转换模块实现了将十位的 AD 数据转换成十六位&#…

JavaWeb 快速入门 javaScript(预测爆文) | 019

今日推荐语 人经常推翻自己&#xff0c;经常不同意昨天的自己&#xff0c;这也是常态。——纪静蓉 日期 学习内容 打卡编号2025年01月20日JavaWeb快速入门javaScript019 前言 哈喽&#xff0c;我是菜鸟阿康。 今天大概学习了下 js 的的基础知识&#xff0c;js …

[c语言日寄]内存初阶:大端字节序和小端字节序

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…