[c++] enum和string相互转换

news2024/11/20 12:33:59

enum和string相互转换

  • 简介
  • 满足的需求
  • code
  • 使用方法
    • 可优化点
  • 参考链接

简介

原理还是很朴素的方法,只是用省略了重复代码,降低维护难度;

// enum to string
std::string enum2Str(Color c)
{
	switch(c){
		case RED: return "RED";
		case ORANGE: return "ORANGE";
		......
		default: return "Unknown"
	}
}
// string to enum
Color enumStr2Enum(const char* enumStr)
{
	if (0 == strcmp(enumStr, "RED")) return T::RED;
	......
	if (0 == strcmp(enumStr, "Unknown")) return T::Unknown;
}

满足的需求

  1. 更新枚举时不用修改转换相关的接口(enum2Str, str2Enum…);
  2. 在不同的库使用时只需包含头文件;
  3. enum能转换成字符串类型,字符串也能转成enum,当然字符串也能转换成enumValue;

code

只有头文件

// foo.h
#include<type_traits>
#ifndef COLOR_H
#define COLOR_H

#define DEF_ENUMS  \
    X(RED, 1)    \
    X(ORANGE, 2) \
    X(YELLOW, 3) \
    X(GREEN, 4)  \
    X(CYAN, 5)   \
    X(BLUE, 6)   \
    X(Unknown, UCHAR_MAX)

enum class Color : uint8_t {
#define X(name, value) name = value,
    DEF_ENUMS
#undef X
};

template <typename T>
concept enumType = std::is_enum<T>::value;

/// enum to string
template <enumType T>
std::string enum2Str(T e)
{
    switch (e) {
#define X(name, value) \
    case T::name:      \
        return #name;
        DEF_ENUMS
#undef X
    default:
        return "Unknown";
    }
}

/// string to enum
template <enumType T>
T enumStr2Enum(const char* enumStr)
{
#define X(name, value)               \
    if (0 == strcmp(enumStr, #name)) \
        return T::name;
    DEF_ENUMS
#undef X
        return T::Unknown;
}

template <typename enumType>
using enumValue_t = std::underlying_type_t<enumType>;
/** string to enum value
 * @brief if enumStr not exist, return "Unknown"
 */
template <enumType T>
enumValue_t<T> enumStr2Value(const char* enumStr)
{
#define X(name, value)               \
    if (0 == strcmp(enumStr, #name)) \
        return value;
    DEF_ENUMS
#undef X
        return static_cast<enumValue_t<T>>(T::Unknown);
}
#endif /* COLOR_H */

使用方法

#include <iostream>
#include "foo.h"
int main(){
	Color color{Color::GREEN};
    printf("enum2Str(color): %s\n", enum2Str(color).c_str());
    printf("enumStr2Value<Color>: %d\n", enumStr2Value<Color>("GREEN"));
    printf("enumStr2Enum<Color>: %d\n",enumStr2Enum<Color>("GREEN"));
	return 0;
}

输出

可优化点

头文件可能看着比较难懂,不知开放出来的接口是哪些;
感觉可以把宏的实现改到cpp里,但得注意多个文件使用时的坑
函数定义写在头文件中可能导致的多重定义错误(multiple definition)
C++模板类/函数,将头文件与源文件分离

参考链接

The X Macro - Digital Mars
X-Macros

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

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

相关文章

Pytorch从零开始实现Vision Transformer (from scratch)

Pytorch从零开始实现Vision Transformer 前言一、Vision Transformer架构介绍1. Patch Embedding2. Multi-Head Attention3. Transformer BlockFeed Forward 二、预备知识1. Einsum2. Einops 三、Vision Transformer代码实现0. 导入库1. Patch Embedding2. Residual & Norm…

Ethereum以太坊事件日志查询参数

目录 一、Ethereum事件日志查询参数二、需求三、实现四、其他 一、Ethereum事件日志查询参数 addresses&#xff1a;合约地址列表fromBlock&#xff1a;开始区块toBlock&#xff1a;结束区块topics&#xff1a;主题数组blockhash&#xff1a;区块哈希&#xff0c;优先级高于fr…

chatgpt赋能Python-python3_9_1怎么用

Python3.9.1是什么&#xff1f; Python是一种高级、动态、解释型语言&#xff0c;具有优雅简洁、易于学习和阅读、功能丰富的特点。Python 3.9.1是Python编程语言的一个版本&#xff0c;于2020年12月21日正式发布&#xff0c;是Python 3的最新稳定版本。它包含了许多新的特性、…

chatgpt赋能Python-python3_7降级3_6

Python 3.7降级3.6&#xff1a;为什么&#xff1f;如何做&#xff1f; 如果你是一个认真的Python开发者&#xff0c;你可能会对Python 3.7的某些改进感到兴奋。但是&#xff0c;在某些情况下&#xff0c;你可能需要将Python降级到3.6版本。在这篇文章中&#xff0c;我们将探讨…

网吧管理系统修正

文章目录 网吧管理系统修正1. 改动1&#xff1a;上机缴费2. 改动2&#xff1a;下机超时计费3. 改动3&#xff1a;注销强制下机操作4. 改动4&#xff1a;计费标准数据的获取与释放 网吧管理系统修正 Carry文件中&#xff0c;打开文件忘记关闭了&#xff0c;虽然C语言中不会报错…

【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第八届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 学习完了所有模块之后(LIS302考点取消了, 扩展板也找不到了&#xff0c;如果你能找到可能你不是在十四届省赛后买的扩展板), 跟省赛一样&#xff0c;先拿第…

这个屏幕录制太好用了!

哈喽&#xff0c;大家好&#xff01;今天给各位小伙伴测试了一屏幕录制的小工具——ApowerREC。它是一款专业同步录制屏幕画面及声音的录屏软件。界面简洁&#xff0c;操作简单&#xff0c;支持实时编辑屏幕录像、创建计划任务、录制摄像头高清视频等功能。废话不多说&#xff…

汇编九、直接地址与寄存器、ROM和RAM

1、直接地址与寄存器 1.1、A和ACC (1)A是没有地址的&#xff0c;可以当作寄存器使用。 (2)ACC是有地址的&#xff0c;地址为E0H(查数据手册)。 (3)如果使用压栈操作&#xff0c;要用ACC。因为ACC可当做直接地址。 (4)如果使用位操作&#xff0c;要用ACC。因为ACC可位寻址。…

总结855

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;张宇强化前10讲&#xff0c;背诵15篇短文&#xff0c;熟词僻义300词基础词&#xff09; 周目标&#xff1a;张宇强化前3讲并完成相应的习题并记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#…

chatgpt赋能Python-python3_9_2怎么安装

Python3.9.2的安装指南 Python是一种高级编程语言&#xff0c;广泛应用于各种领域&#xff0c;从数据科学到机器学习到Web应用程序。Python具有易学性和通用性&#xff0c;因此成为众多开发人员的首选语言。此篇文章将指导您如何安装Python3.9.2版本。 为什么选择Python3.9.2…

Packet Tracer – 对 VLAN 实施进行故障排除 – 方案 1

Packet Tracer – 对 VLAN 实施进行故障排除 – 方案 1 地址分配表 设备 接口 IP 地址 子网掩码 交换机端口 VLAN PC1 NIC 172.17.10.21 255.255.255.0 S2 F0/11 10 PC2 NIC 172.17.20.22 255.255.255.0 S2 F0/18 20 PC3 NIC 172.17.30.23 255.255.255.0…

一星期学mysql day2

文章目录 DQL&#xff08;数据查询语言&#xff09;基础查询条件查询聚合查询&#xff08;聚合函数&#xff09;分组查询注意事项 排序查询注意事项 分页查询注意事项 编写顺序DQL执行顺序 DCL 管理用户管理用户注意事项 权限控制注意事项 函数字符串函数数值函数日期函数流程函…

车辆管理系统的设计与实现

背景 4S店车辆系统&#xff0c;为用户随时随地查看4S店车辆信息提供了便捷的方法&#xff0c;更重要的是大大的简化了管理员管理4S店车辆信息的方式方法&#xff0c;更提供了其他想要了解4S店车辆信息及运作情况以及挑选方便快捷的可靠渠道。相比于传统的管理方法&#xff0c;…

chatgpt赋能Python-python3_8怎么安装numpy库

Python3.8怎么安装numpy库&#xff1f;一个详细的步骤指南 你是否想要在Python3.8中安装numpy库&#xff0c;但不知道如何开始&#xff1f;没问题&#xff0c;本篇文章将介绍Python3.8的numpy安装步骤。 什么是numpy&#xff1f; numpy是Python中的一个重要的数学计算库&…

chatgpt赋能Python-python3_7怎么保存

Python 3.7 - 新的保存方式 Python 语言是一种广泛使用的编程语言之一&#xff0c;它在数据分析、网络编程、科学计算等领域都得到了广泛的应用。Python 的一个新版本&#xff0c;Python 3.7&#xff0c;增加了一种新的保存方式&#xff0c;这种方式可以提高数据的保存效率&am…

ElasticSearch漫游 (5.RestClient初始化准备)

之前都是在客户端页面各种操作&#xff0c; 但是我们作为一个java开发者&#xff0c;需要使用代码的方式 来操作ES&#xff0c; 所以我们要先从 Rest Client 开始 准备数据 既然是ES 查数据 不整点测试数据 没法下饭是吧 先建个酒店表 搞点数据&#xff1a; &#xff08;新手…

两款亲测非常优秀的压缩软件

哈喽&#xff0c;大家好。今天给大家带来两款超级好用的压缩软件&#xff0c;一款是老牌的WinRAR&#xff0c;另一款是开源的7-Zip。 这两款都是小编电脑上必备的压缩软件&#xff0c;至于为什么要装两款嘛&#xff0c;可能因为任性吧&#xff0c;哈哈。 一、测试演示参数 演…

nvm-windows安装和配置

1.下载nvm-windows https://github.com/coreybutler/nvm-windows/releases 进入后如下图 选择nvm-setup.exe下载 2.安装 2.1 运行安装包&#xff0c;同意协议&#xff0c;下一步 2.2 选择nvm的安装目录&#xff0c;安装路径名最好不要有空格 2.3 点击Next&#xff0c;设…

【CPP】NULL nullptr

文章目录 NULLnullptr总结Ref. NULL 在C中&#xff0c;NULL实际上是0.因为C中不能把void*类型的指针隐式转换成其他类型的指针&#xff08;cpp是强类型语言&#xff09;&#xff0c;所以为了解决空指针的表示问题&#xff0c;C引入了0来表示空指针&#xff0c;这样就有了上述代…

Python 爬虫(七):pyspider 使用

1 简介 pyspider 是一个支持任务监控、项目管理、多种数据库&#xff0c;具有 WebUI 的爬虫框架&#xff0c;它采用 Python 语言编写&#xff0c;分布式架构。详细特性如下&#xff1a; 拥有 Web 脚本编辑界面&#xff0c;任务监控器&#xff0c;项目管理器和结构查看器&#…