(转)C++中枚举与字符串相互转换

QMetaEnum: C++ 中将枚举值自动转换为字符串 当我们需要在日志中输出枚举类型的信息时,如果只记录一个数字,查看日志时就需要再去查找这个枚举值的意思,不直观,不方便,我们会希望可以直接输出这个枚举值对应的字符串。比如下面这个枚举 Color,我们该如何将枚举值 Red 转化为字符串 “Red”? enum Color{ Red, Orange, Yellow, green }; # 运算符 一种最直接的方法是:使用 map 或者 list 之类的容器做一个映射。还有一个更简单的做法,我们可以借助宏 (macro) 的 # 运算符 (Stringi 阅读详情

C++中枚举与字符串相互转换


 

前言

有的时候我们喜欢使用一些外部的文件保存管理一些配置信息,这些配置文件大多都是文本格式例如ini,xml等,这样方便编辑和管理。因此在使用的过程中必然会遇到各种字符串转换问题。
最常见的便是将字符串的数字转换为对应的整形(integer)或者浮点(float),如果遇到枚举类型,可能便会想当做是整形来处理,但觉得不是特别理想。如果能有办法直接转换为枚举会方便很多。

案例

一个简单的配置文件:

1 [config]
2 fooInt = 10
3 fooFloat = 2.5
4 fooEnum = cpp

在C++里面有枚举:

1 enum ProgLang
2 {
3      e_cpp,
4      e_java,
5      e_csharp
6 };

如果对于前面两个数值,可以很简单的读取,例如:

1 Config cfg;//Config 类见<<C++编写Config类读取配置文件>>
2 cfg.Load( "config.ini" );
3  
4 int fooInt = cfg.GetValue< int >( "fooInt" );
5 float fooFloat = cfg.GetValue< float >( "fooFloat" );

对于后面那个枚举,可能就稍微麻烦一点:

1 ProgLang fooEnum;
2 const char * rawData = cfg.GetValue< const char *>( "fooEnum" );
3 if ( strcmp (rawData, "cpp" )) fooEnum = e_cpp;
4 else if ( strcmp (rawData, "java" )) fooEnum = e_java;
5 else if ( strcmp (rawData, "csharp" )) fooEnum = e_csharp;

如果直接在配置文件里面不保存”cpp“字符串而直接保存枚举值,这里便可以当整形取出来再做类型转换。不过这样不安全,也不好维护,如果枚举内部的定义发生了变化,外部保存的数据自然也就会失效出错。

解决方案

C++没有(也不可能会有)反射机制,枚举成员在编译以后也已经变成了纯粹的数值,失去了名字。所以想使用字符串作为搜索依据,必须为枚举保留一份名字信息,例如:

1 enum ProgLang
2 {
3      e_cpp,
4      e_java,
5      e_csharp
6 };
7 const char * ProgLangNames[] = { "cpp" , "java" , "csharp" };

这个字符串数组只能预先写好,无论是手动还是通过工具自动生成。然后可以在这个字符串数组里面搜索目标字符串,将找到的结果下标转换为对应的枚举值即可,例如:

1 for ( int i = 0; i < sizeof (ProgLangNames) / sizeof (ProgLangNames[0]); ++i)
2 {
3      if ( strcmp (rawData, ProgLangNames[i]))
4      {
5          fooEnum = static_cast <ProgLang>(i);
6          break ;
7      }
8 }

枚举关联字符串

解决方案找到了,随之而来的问题就是如何将枚举与所需要的字符串查找表联系起来。如有多个枚举:

01 enum ProgLang
02 {
03      e_cpp,
04      e_java,
05      e_csharp
06 };
07 const char * ProgLangNames[] = { "cpp" , "java" , "csharp" };
08  
09 enum ScriptLang
10 {
11      e_lua,
12      e_actionscript,
13      e_javascript
14 };
15 const char * ScriptLangNames[] = { "lua" , "actionscript" , "javascript" };

枚举不像类或结构体可以定义自己的成员变量,所以查找表只能在外部定义,通过实例化模板类来将他们相互联系起来。例如:

1 < template EnumType>
2 struct SEnumName
3 {
4      static const char * List[];
5 }

这定义了一个查找表的模板结构体,然后将之前的代码改造为:

01 enum ProgLang
02 {
03      e_cpp,
04      e_java,
05      e_csharp
06 };
07 const char * SEnumName<ProgLang>::List[] =
08 {
09      "cpp" ,
10      "java" ,
11      "csharp"
12 };
13  
14 enum ScriptLang
15 {
16      e_lua,
17      e_actionscript,
18      e_javascript
19 };
20 const char * SEnumName<ScriptLang>::List[] =
21 {
22      "lua" ,
23      "actionscript" ,
24      "javascript"
25 };

然后便可以实现字符串转枚举的功能:

01 template < typename EnumType>
02 EnumType ConvertStringToEnum( const char * pStr)
03 {
04      EnumType fooEnum = static_cast <EnumType>(-1);
05      int count = sizeof (SEnumName<EnumType>::List) /
06          sizeof (SEnumName<EnumType>::List[0]);
07      for ( int i = 0; i < count; ++i)
08      {
09          if ( strcmp (rawData, SEnumName<EnumType>::List[i]))
10          {
11              fooEnum = static_cast <ProgLang>(i);
12              break ;
13          }
14      }
15      return fooEnum;
16 }

这样一来,最开始的问题就可以简化为:

1 ProgLang fooEnum = cfg.GetValue<ProgLang>( "fooEnum" );

有了这种方式,自然枚举反转回字符串也很容易了,就不再赘述了。

 

转载出处:  http://a.vifix.us/blog/cpp-convert-string-enum

使用boost::describe模块实现C++中的字符串到枚举类型的转换 在本文中,我们将介绍如何使用Boost的describe模块来实现字符串到枚举类型的转换,并给出相应的测试程序。然后,我们使用boost::describe::enum_value函数将colorStr转换为对应的Color枚举值。接下来,我们将给出一个示例来演示如何使用describe模块实现字符串到枚举类型的转换。有了映射规则之后,我们可以使用describe模块中的函数来进行字符串到枚举类型的转换。通过使用Boost的describe模块,我们可以方便地实现字符串到枚举类型的转换。 阅读详情

相关推荐

enum_strings:c ++ enum可转换为和从字符串

枚举字符串 C++ 枚举可与字符串相互转换。 源代码是从几个来源收集的,并稍作修改。 代码中引用了原始来源。 例子 # include " enum_conversions_macro.h " ENUM_CLASS (Day, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); int main () { // get enum size std::cout << " enum size: " << EnumManager>:: size () << std xss=removed xss=removed>:: toString (e); std::co

C/C++ 枚举转字符串

枚举转字符串 [TOC] 1.开篇   在代码调试时,我们经常需要直观地定位当前枚举变量为哪个枚举常量。通常通过打印枚举值就可以确定,但是当枚举常量表过多时,就不那么直观了。本篇记录一种C/C++枚举变量转字符串的实用技巧。 2.实现原理   在学习C语言宏的时候,有看到 “#” 在宏(#define)中有一些特殊的用法,这里先回顾一下: #: 预处理阶段,将宏参数转化为字符串 ##: 预处理阶...

LinuxTaoist的博客 4037

【STC8G1K08A串口使用】

STC8G1K08A串口打印“Hello world”

m0_47459564的博客 1万+

C++自定义的枚举类型(enum)和字符串相互转换

在使用上非常简洁的实现C++的enum(枚举类型)和string相互转换,定义和使用过程和enum几乎一样,但可以实现enum和string相互转换。

ST_stone的博客 1万+

【AutoDL】使用云服务器跑深度学习代码

1.算力市场 租用服务器,选择自己心仪的服务器2.镜像可以选择一些基础的镜像,社区镜像里是git上有的环境。3.上传文件在文件存储中,选择上传的区,在右边点击上传,选择自己的文件上传到云服务器中。

weixin_45768644的博客 3701

从零到英雄:如何用FPGA和AD9288打造你的第一台便携式示波器

本文详细介绍了如何利用FPGA和AD9288 ADC芯片从零开始打造一台高性能便携式示波器。通过硬件架构设计、高速数据采集系统实现及信号处理与显示系统的开发,读者可以掌握400Msps采样率的实现方法,并了解关键器件选型与系统优化技巧。

jjj34的博客 277

C++ 字符串和枚举互转 std::string enum

引入轻量库magic_enum。

github_38407094的博客 864

三菱FX3U PLC红绿灯ST编程实战:从基础逻辑到急停功能完整实现

本文以十字路口红绿灯控制为例,详细讲解了三菱FX3U PLC使用ST编程的完整实战过程。内容涵盖从基础时序逻辑、状态机设计,到急停功能、黄灯闪烁、昼夜模式切换等高级功能的实现,并提供了代码优化与调试技巧,帮助工程师掌握结构化文本在工业控制中的清晰、结构化应用。

weixin_29070861的博客 532

C++枚举与字符串之间的转换

template struct SEnumName { static const char* List[]; }; enum ProgLang { e_cpp, e_java, e_csharp }; const char* SEnumName::List[] = { "cpp", "java", "csharp" }; enum ScriptLang { e_lua, e_a

ceasadan的博客 1万+

Android无线调试:adb tcpip连接实战指南

本文详细介绍了Android无线调试的完整流程,重点讲解如何使用adb tcpip命令通过Wi-Fi连接设备,摆脱数据线束缚。涵盖环境配置、连接实战、稳定性优化及常见问题排查,帮助开发者高效实现无线adb调试,提升工作效率。

pink的博客 720

FPGA赋能:从加权灰度均值到快速收敛的自动曝光实战

本文深入探讨了FPGA在工业视觉自动曝光算法中的应用,重点介绍了加权灰度均值法的优化实现与快速收敛策略。通过硬件友好的算法改造和流水线架构设计,FPGA方案能在1帧内完成曝光调整,显著提升处理速度和能效比,适用于复杂光照条件下的工业检测场景。

weixin_29306317的博客 82

【建议收藏】QT实现字符串和枚举的相互转换,从源码角度分析实现原理

QT中实现字符串和枚举的转换主要是利用Qt的元对象机制。类必须继承于QObject并使用Q_OBJECT宏;类内添加枚举,使用Q_ENUM宏将枚举注册到元对象系统中;

q2nAmor 2473

全功能爬虫框架:Botasaurus 的详细使用(现代化、反检测、高并发的智能爬虫框架)

Botasaurus是一个基于 Python 的全栈式智能数据采集框架。它深度融合了以下关键技术: 无头浏览器自动化(Headless Browser Automation):基于 Playwright 或 Puppeteer,支持 Chromium、Firefox、WebKit; 高级反检测引擎(Anti-Detection Engine):自动绕过 WebDriver、Canvas、AudioContext 等 50+ 种指纹检测; 声明式任务模型(Declarative Task Model):用装

数据知道的博客 4369

(转载)C++中枚举与字符串相互转换

  有的时候我们喜欢使用一些外部的文件保存管理一些配置信息,这些配置文件大多都是文本格式例如ini,xml等,这样方便编辑和管理。因此在使用的过程中必然会遇到各种字符串转换问题。   最常见的便是将字符串的数字转换为对应的整形(integer)或者浮点(float),如果遇到枚举类型,可能便会想当做是整形来处理,但觉得不是特别理想。如果能有办法直接转换为枚举会方便很多。 一个简单的配置文件: ...

cx732cx 1万+

基于Simulink的无线充电系统LCC补偿网络建模与控制

本文详细介绍了基于Simulink的无线充电系统LCC补偿网络建模与控制方法。首先分析了LCC补偿网络的恒流输出、软开关实现和抗偏移能力等优势,并对比了不同补偿拓扑特性。随后分步骤讲解了Simulink建模流程,包括LCC主电路构建、关键参数设计、双闭环控制系统实现等核心环节。重点阐述了移相控制策略和软开关验证方法,提供了系统效率计算和抗偏移测试的调试技巧。最后展示了仿真结果,在耦合系数变化20%时,闭环系统仍能保持输出电压稳定在±2%波动范围内。文章还探讨了工程扩展方向,并针对常见问题给出了解决方案,为无

xiaoheshang_123的博客 539

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++枚举与字符串转换工具类

C++枚举与字符串转换工具类 最近需要一个能够在字符串和枚举值之间互相转换的功能,因为C++没有对枚举值进行遍历、反射之类的操作,不像Java那样可以轻松搞定。网上找到一些代码感觉用起来有点不爽,于是研究一番后,写了一个工具类。 闲话不多说,直接上代码: template <typename T> class EnumHelper { private: std::map<T, std::string> _mapEnum2String;

IT技术爱好者 2820

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c++枚举字符串转换工具

在太多的工程中,我们可能都需要将一些枚举、整形标记打到日志中去,如果只打印数组,那也不行啊,出问题翻看日志,还得一个个查询,这时候我们该怎么办呢,写一堆ifelse,写一堆switch,挨个匹配字符,那只能说,小学生代码,能不能搞一个通用的转换呢?这里有个参数很有意思,fallback,他是什么意思呢,是退路,应变计划,说白了就是plantB的意思。stdlower_bound该函数是stdalgorithm里面的,含义大概就是将排好序的序列使用二分查找,返回第一个不小于目标元素的迭代器。.........

南城小馆 1519

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C/C++中枚举值转字符串的技巧

在C、C++中经常需要定义枚举值,或根据枚举值来获取对应的枚举字符串,以下示例巧妙的利用宏的特性来实现,请参考。

halazi100 1万+

C++枚举反射实战:使用USRefl实现字符串与枚举值的双向转换

在C++开发中,枚举类型(enum)是一种常用的数据类型,但原生C++缺乏对枚举的反射支持,这使得枚举值与字符串之间的转换成为一个常见痛点。USRefl作为一款仅需99行代码的C++20静态反射库,提供了轻量级且高效的解决方案。本文将详细介绍如何利用USRefl实现枚举与字符串的双向转换,帮助开发者轻松解决这一难题。 ## 什么是USRefl? USRefl是一个基于C++20的头文件反射库,

gitblog_00241的博客 396

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

c++ 枚举值和字符串相互转换的实现; c++ enum to string; X-Macros 和 宏; #define X ... #undef X

普雷的博客 5178

字符串转枚举(两个枚举类型)

刚刚遇到的问难: 很简单的方法,记下以备以后查看方便 public enum Colcr1 { red, yellow } public enum Colcr2 { green, bule } string str; string a="111"; public AA() { if(Enum.IsDefinde(typeof(Color1),str)) {

Q_haoquan的博客 3200

C++中enum与字符串或CString互相转换的方法

C++中没有专门为enum与字符串或CString互相转换的直接方法,但是工作中会常遇到相互转换的场景。下面介绍一种自己实现的方法,首先得定义一个enum类型,同时,定义一个与之对应的字符串类型,然后,可以相互转换了。 enum E_ANIMAL { E_ANIMAL_EAGLE = 0, E_ANIMAL_MAGPIE, E_ANIMAL_PIG, E_ANIMAL_CARP,

Gordennizaicunzai的博客 1万+

【C++】枚举转字符串

C++枚举转字符串方法;boost

california_0331的博客 2863

参考开源项目实现一个简易的C++枚举转字符串的函数

前段时间接触了 magic_enum 这个开源库,代码量不算太多,是一个但头文件的枚举操作库,关于如何使用还写了一篇总结 《推荐一个C++枚举转字符串的开源项目magic_enum》,当时觉得这个库很棒,但是对于我当前枚举转化字符串的需求还说还是太臃肿了,所以决定改造一下,这不今天过来填坑了...............

AlbertS Home of Technology 4251

AlphaFold 3 结构预测引用与合规:论文致谢、图注模板、许可边界一次讲清

AlphaFold 3 是 Google DeepMind 开源的推理管线,用来生成蛋白质、核酸与小分子复合物的三维结构预测。投稿之前,引用到底怎么写?致谢栏要交代什么?哪些红线不能碰?这篇文章把 AlphaFold 3 引用与使用合规一次讲清。 [![AlphaFold 3 结构预测引用与使用合规指南](https://raw.gitcode.com/gh_mirrors/alp/alphaf

gitblog_01178的博客 640
上一篇: (转)C++编写Config类读取配置文件
下一篇: (转)三维GIS软件十九重唱
berkshirman
博客等级 码龄19年 41粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值