c++11 将enum转为字符串,将字符串转为enum

2023-05-16

   一般用enum有两种情况,一种是string类型方便 “人”读 。一种是int类型,方便机器识别。所以,很多情况,需要把int转为string类型,或者将string转为int类型,方便代码使用。查了很多网页都没发现一个好的实现方式。于是我自己实现了一个。用最少的代码实现int 和 string的绑定关系。

 原理:

        首先,要让编译器能识别,并且有提示,自动填充。这里使用的是类的成员变量来存储int类型,然后用一个map存储string和int的关系。DefCSS 宏展开之后类似如下:

  

public:
    const static int index = __COUNTER__;
private:
    int ii_index = set(index,"index");

        DefCSS2 原理相同       

        __COUNTER__是编译器的一个自增宏定义。

        ii_index 会在该对象初始化的时候调用set,index由于是const static的,所以理论上不占用内存,可以当宏变量使用。public和private的声明只是为了不让别人使用ii_index。ii_index只是为了构造时调用set而定义的变量。

        所以理论上,只需要定义一个对象初始化map,然后释放掉,index和ii_index的关系就存到map中了。在cpp中定义初始化如下:

std::map<std::string, int> CSSExistKey::vk_set;
std::map<int, std::string> CSSExistKey::kv_set;
static CSSExistKey key;//初始化map

        后面的使用就简单了。

int e = CSSExistKey::getKey("index");    //string 转 int
std::string str = CSSExistKey::getValue(e);    //int 转 string
if(CSSExistKey::index == e) ...    //直接当enum使用

  缺点:

        1.由于用到了,定义时构造,所以必须c++11及以上。

        2.不是真正的enum class,不支持编译时类型检测。

使用时发现,const static int 需要在外部定义,否则链接的时候报:未定义的引用。

修改用enum优化如下:

const static int x = __COUNTER__;
//改成 
enum { x = __COUNTER__};

如果编译器实在不支持,可以用支持的编译器进行宏展开。

多个头文件嵌套的时候,可能遇到__COUNTER__不是从0开始,这时候修改如下

enum{BASE = __COUNTER__};
		//#define DefCSS2(x,y) public: static const int x = __COUNTER__; private: int ii_##x = set(x,y);
#define DefCSS2(x,y) public: enum{ x=__COUNTER__ - BASE};private: int ii_##x = set(x,y);
#define DefCSS(x) DefCSS2(x,#x)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++11 将enum转为字符串,将字符串转为enum 的相关文章

  • 【python3】 函数指定参数类型,如:fun(self, s: str) -> str:

    目录 指定参数方法如下 xff0c 参考 GetStringSelf的定义 虽然能够指定参数类型 xff0c 当输入参数类型错误不会报错 返回值错误也不报错 总结 xff1a 今天突然发现了在python3中的函数定义可以指定参数了 因此写
  • 自相关函数与互相关函数

    转自 xff1a https blog csdn net denghecsdn article details 78848046 1 概念 相关函数是描述信号X s Y t xff08 这两个信号可以是随机的 xff0c 也可以是确定的 x
  • [错误记录]The ‘typing‘ package is an obsolete backport of a standard library package

    在使用pyinstaller时报错如下 xff0c The 39 typing 39 package is an obsolete backport of a standard library package and is incompat
  • [计算机通信网络]以太网的帧格式详解

    目录 一 前言 二 以太网的帧格式 Preamble xff08 前导码 xff09 xff1a SFD xff08 帧开始定界符 xff09 xff1a Destination Address xff0c Source Address x
  • [Linux]Windows使用ssh连接Linux虚拟机(mininet)

    作者 xff1a 清水寺丞 简介 xff1a 正在学习unity xff0c 数据库 xff0c 计算机通信网络和python 喜欢部署各种奇奇怪怪的小项目 喜欢就点个关注一起学习吧 目录 前言 xff1a 一 步骤 1 查看虚拟机IP地址
  • [SDN]使用mininet搭建单臂路由的VLAN网络

    作者 xff1a 清水寺丞 简介 xff1a 正在学习unity xff0c 数据库 xff0c 计算机通信网络和python 喜欢部署各种奇奇怪怪的小项目 喜欢就点个关注一起学习吧 前言 xff1a 本文实践了使用mininet来搭建一个
  • Spring整合MyBatis导致一级缓存失效问题

    熟悉MyBatis的小伙伴都知道MyBatis默认开启一级缓存 xff0c 当我们执行一条查询语句后 xff0c MyBatis会以我们查询的信息生成一个缓存key xff0c 查询的结果为value xff0c 存到一个map中 xff0
  • 用echarts写潮汐表,并处理后端传来的数据为潮汐表接口的数据

    这是后端传来的接口类型 xff1a 其中分别是今天 xff0c 昨天 xff0c 明天的数据 xff0c 一天24个小时 xff0c 分别为a0和a23表示 xff1b 后端接口数据如下 xff1a dom表单代码如下 xff1a lt d
  • 分类算法-Logistic Regression(逻辑回归)实战案例

    一 定义 逻辑回归是一种广义线性回归模型 xff0c 主要用于二分类 问题 xff08 也可以用于多分类 xff09 xff0c 具有简单 可并行化 解释性强的特点 xff0c 目前在各个领域使用的都非常频繁 逻辑回归的本质是假设数据服从伯
  • 快乐数算法

    def sum l n sum a 61 0 for i in str n sum a 43 61 int i 2 return sum a sum1 61 n 61 int input 请输入数字 while sum l n not in
  • 2021-04-26

    标题altium 相同原理图导入PCB厚如何避免重复建布局 思想 xff1a channel offset 使每个component的offset一致 方法 xff1a 步骤一 xff0c 选取其中一个布局好 xff0c 创建一个room1
  • 深度学习模型压缩与优化加速

    1 简介 深度学习 xff08 Deep Learning xff09 因其计算复杂度或参数冗余 xff0c 在一些场景和设备上限制了相应的模型部署 xff0c 需要借助模型压缩 优化加速 异构计算等方法突破瓶颈 模型压缩算法能够有效降低参
  • 选择排序算法(思路分析) [数据结构][Java]

    选择排序算法 思路分析 基本介绍 选择排序也属于内部排序的一种 是从 34 欲排序的数据 34 中 按照指定的规则选出某一元素 再根据规定交换位置后达到排序的目的 选择排序思想 以升序排序为例讲解 选择排序 Select Sorting 也
  • 2021-09-29

    第一次数据结构与算法作业 https share weiyun com Bfh1pSeJ 初学者 x1f913 xff0c 算法漏洞较多 希望各位大佬指点一下 xff0c 谢谢大家
  • 2021-10-27

    十进制整数转换 xff0c 使用链栈实现 xff0c 实验报告 内容 xff1a 将十进制整数num转换为r进制数 xff0c 其转换方法为辗转相除法 xff0c 要求用链栈实现 算法分析 xff1a 程序中设计了四个函数 函数IiStac
  • C++生成随机数

    随机数通过 随机数引擎类 和 随机数分布类 引擎类可以生成 unsigned xff08 无符号数 xff09 随机数序列 xff1b 分布类使用一个引擎类生成指定类型的 在给定范围内的 服从特定概率分布的随机数 它们定义在头文件 rand
  • 进程间的通信-信号量(C语言)

    目录 一 信号量 1 什么是信号 2 在linux下 xff0c 有哪些信号 3 在linux下 xff0c 这些信号究竟是由谁来发出 4 用户如何发送信号给进程 xff1f 二 信号的函数接口 1 如何发送信号给另外一个进程 2 如何捕捉
  • Python实现设计模式之工厂模式

    引言 设计模式是可重复使用的编程方案 xff0c 已被用于各种现实世界的环境中 xff0c 并被证明能产生预期的结果 在本文中 xff0c 我们将学习最常见的设计模式之一 xff1a 工厂模式 正如我们稍后将看到的 xff0c 这种模式使我
  • 地表最强AI 辅助编程工具——GitHub Copilot安装教程

    GitHub Copilot 文章目录 GitHub Copilot一 GitHub Copilot 介绍二 GitHub Copilot 通行证注册流程1 打开GitHub Copilot 网址 https copilot github
  • 【暑期每日一题】洛谷 P1605 迷宫

    题目链接 xff1a P1605 迷宫 洛谷 计算机科学教育新生态 luogu com cn 题目描述 给定一个 N M 方格的迷宫 xff0c 迷宫里有 T 处障碍 xff0c 障碍处不可通过 在迷宫中移动有上下左右四种方式 xff0c

随机推荐

  • 关于外网访问本地服务器

    我在网上查到的外网访问本地服务器的方式有两种 xff1a 第一种是通过内网穿透的技术实现的 第二种是通过申请域名 xff0c 申请空间 xff0c 申请云服务器 xff0c 搭建网站实现的 内网穿透的方式实现外网访问本地服务器 选择合适的内
  • Python基础知识点-- if 语句

    此文章为Python基础知识点 xff08 从入门到实践 xff09 if 语句 xff0c 此节Python基础知识点包括 xff1a 条件测试 if 语句 使用if 语句处理列表 设置 if 语句格式 目录 一 条件测试 1 1 检查是
  • SecureCRT 上传文件

    目录 一 xff0e 用SecureCRT来上传和下载文件 1 在使用SecureCRT上传下载之前需要给服务器安装lrzsz xff1a 2 命令sz rz的使用方法 xff1a 3 设置上传 下载文件的默认目录 二 使用TFP上传 一
  • 【错误解决】Segmentation fault (core dumped)爆栈解决

    大家好 xff0c 我是编程的赛赛 xff0c 专注于保姆级代码教程 说明 Segmentation fault core dumped 这个错误在Linux下运行程序时出现的原因多种多样 xff0c 本质大多是内存操作错误 xff0c 以
  • Debian10自签CA证书

    基础知识 1 3思路 想构建CA必须要了解CA构建的情况 请先参照加密解密方面博客 简单思路如下 构建私有CA 生成私钥 自签署证书 2 给节点发放证书 节点申请证书 生成私钥 生成证书签署请求 把请求文件发送给CA 3 CA签署证书 验正
  • Debian10安装教程

    Debian 10 Buster 安装过程图文详解 360doc com nbsp 需求 nbsp 步骤 由于比赛是最小安装 这里我们选择第二项 第一项是图像化界面 第二项是字符界面 语言 nbsp 根据赛题要求 这里选择语言为Englis
  • Questa-sim安装最后一步点了是之后,安装了hardlock.sys文件导致电脑无限蓝屏重启的解决方案

    学习FPGA xff0c 需要安装Questa sim仿真软件 xff0c 没有提前看安装教程 xff0c 在软件安装的最后一步 xff0c 本应该点击否 xff0c 我点了是以后电脑直接蓝屏无限重启 xff0c 真是反人类的设计 xff1
  • 用定时器计数器计算初值

    只需要输入晶振频率 定时时长和计时方式 一般选择方式1 即可 如晶振为12MHz 定时时长为50ms 方式1 xff0c 即可计算出初值为3CB0 xff0c 如下图所示 总结 xff1a 定时器在单片机有着极其重要的作用 xff0c 利用
  • Linux系统管理---xfs文件系统--centos7

    目录 一 XFS文件系统 xff1a 1 数据区 xff08 data section xff09 2 文件系统活动登录区 xff08 log section xff09 3 实时运行区 xff08 realtime section xff
  • 中文code:blocks安装(三分钟包安装成功,不成功你找我)

    目录 一 下载code bocks压缩包并解压 a 百度网盘下载压缩包 xff08 不需安装了 xff09 b 创键快捷方式并拉到桌面 二 一步完成汉化 xff0c 两步完成调试环境 a 打开上面创建在桌面上的快捷方式 b 一步汉化 c 两
  • 2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛)题解(7道题)

    只有 xff1a B xff0c D xff0c E xff0c G xff0c I xff0c K xff0c L 正文 B xff1a 题目链接 Error 题目 xff1a 思路 xff1a 二分 二分给出一个d xff0c 先考虑第
  • mysql jar包下载(直接链接下载)

    mysql connector java 8 0 23 jar的下载链接 xff1a mysql jar包下载 服务器一年后过期 xff0c 过期的话先用百度网盘下载吧 链接 xff1a https pan baidu com s 187w
  • Druid-1.1.12.jar下载 (链接下载+使用)

    链接下载 xff1a 下载链接 不行的话用网盘下载 网盘下载 xff1a 链接 xff1a https pan baidu com s 1VUvRj VuxCDd3fb uvA8Q pwd 61 1111 提取码 xff1a 1111 下载
  • 第十三届蓝桥杯c++b组2022年国赛决赛题解

    写的不是很好 xff0c 8000 43 浏览量后开的粉丝可见 xff0c 希望涨一点点粉 觉得还阔以的 xff0c 就不要取关了Fight xff4f 39 39 题目pdf下载 xff1a 第十三届蓝桥杯大赛软件赛决赛pdf下载 G题没
  • OpenWrt 设置IP地址

    注 本文是基于Ubuntu14 04 43 Openwrt17 01开发的教程 5 1在开发板上设置IP 由于我们在开发过程中 xff0c 可能会用到其他路由器 xff0c 而它们的IP一般都是192 168 1 1 xff0c 为了让开发
  • java打包成exe(带图片,不放大)

    目录 一 如何把java程序打包成exe文件 二 过程 二 1 如何将java程序打包成jar包 二 2 如何使用软件exe4j将jar包打包成exe文件 三 如何在打包的时候带上图片和音乐 四 如何打包后不放大 五 如何把exe文件发送给
  • 【华为OD机试真题java、python、c++、jsNode】匿名信(100%通过+复盘思路)

    nbsp nbsp 代码请进行一定修改后使用 本代码保证100 通过率 本文章提供java python c jsNode四种代码 复盘思路在文章的最后 题目描述 电视剧 分界线 里面有一个片段 男主为了向警察透露案件细节 且不暴露自己 于
  • 第十四届蓝桥杯javaA组2023年省赛初赛题解

    题目pdf下载 xff1a 第十四届蓝桥杯省赛pdf下载 目录 试题 A 特殊日期 试题 B 与或异或 试题 C 平均 试题 D 棋盘 试题 E 互质数的个数 试题 F 阶乘的和 试题 G 小蓝的旅行计划 试题 H 太阳 试题 I 高塔 试
  • JsNode算法题acm模式输入

    js分为jsNode和JsV8两种输入输出方式 xff0c 一般的执行代码还是一样的 牛客是两种都支持 华为的题目大多只支持jsNode 本文主要介绍jsNode的输入 JsNode 首先他是逐行输入的 xff0c 就和py差不多 xff0
  • c++11 将enum转为字符串,将字符串转为enum

    一般用enum有两种情况 xff0c 一种是string类型方便 人 读 一种是int类型 xff0c 方便机器识别 所以 xff0c 很多情况 xff0c 需要把int转为string类型 xff0c 或者将string转为int类型 x