(转载)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

Win11桌面图标小箭头去除与恢复:解决任务栏关联错误的完整指南

本文提供了一份完整的Win11桌面图标小箭头去除与恢复指南,重点解决了因错误方法导致的任务栏关联错误问题。通过分析注册表中IsShortcut键值与Shell Icons的原理,推荐安全的“替换图标资源法”,并提供了可一键执行的批处理脚本,确保在美化桌面的同时不影响系统功能与默认应用设置。

weixin_29288313的博客 941

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

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

ST_stone的博客 1万+

CentOS7上装不了最新Chrome?别折腾依赖了,试试这个老版本安装法(附103.0.5060.24 beta下载地址)

本文提供了在CentOS7上安装兼容版Chrome的详细指南,解决了因GLIBC版本限制导致的最新版Chrome无法安装的问题。推荐使用Chrome 103.0.5060.24 beta版本,并附有下载地址和完整安装步骤,包括禁用自动更新和配套工具安装,确保系统稳定性和功能完整性。

weixin_29289821的博客 566

Speedtree学习笔记(案例)——拥有多种材质的植物如何导入使用(以草为例)

注:Speedtree无论保存还是导入模型其存储路径不可有中文。 第一步拆分草的模型 根据所需的材质去拆分(例:假若草的果实,茎秆和叶子是不同的材质那么就需拆分为三份;假若画的全部颜色及材质一样就没有必要去拆分模型) 第二步导入草的模型 在Mesh面板中依次导入草的模型——Do nothing additional right now 第三步扩大草的生长区域范围(可省略)...

L人青的博客 5722

c++ 枚举与字符串 比较

读取字符串,然后将这个字符转换为对应的枚举。 如:从屏幕上输入'a',则转换为set枚举中对应的a,源代码如下: //关键函数为char2enum(str,temp); #include using namespace std; enum set {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y...

alppkk4545的博客 696

模块学习(一)——编码电机

编码电机测速

qq_51406846的博客 7911

C++中的枚举值类型转化为整数和字符串

C++中的枚举类型C++11提供了更安全的枚举类型,不能再直接把这种枚举值当作整数值来使用。但如果我们想把它作为整数来使用呢?例如enum class ElemType{ CAP, IND, VS};在以前,我们使用枚举类型的时候,没有添加class关键词,可以如下定义,enum ElemTypeOld{ CAP = 1, IND, VS = 3};在...

1484

Origin 2025b中文版安装全指南:避开乱码、水印与崩溃陷阱

Origin作为科研绘图领域的事实标准,其2025b版本首次官方支持简体中文UI,但安装远非‘下一步’即可完成。核心在于理解软件本体、语言包、许可证服务与系统区域设置四者间的耦合关系——尤其Windows非Unicode程序语言必须设为‘中文(简体,中国)’,否则必然触发坐标轴乱码、PDF文字方块等典型故障;而AI辅助拟合、内置Python 3.11等新特性,又依赖正确的字体链(如SimSun)与注册表强制加载(UILanguage=zh-CN)才能稳定启用。该版本广泛应用于材料科学、电化学、XRD/SEM

weixin_42548874的博客 1393

贝叶斯(Bayes)决策理论

在博文【模式识别PR和模式的概念】介绍了相关的模式识别与模式的概念。在本节描述所要讨论的问题之前,再提一下对于待识别的物理对象的描述问题。假设一个待识别的物理对象用其d个属性观察值描述,称之为d个特征,这组成一个d维的特征向量,而这d维待征所有可能的取值范围则组成了一个d维的特征空间。一般地,机器实现自动分类有两大类方法:一种是模板匹配方法,另一种是对特征空间划分为子空间(每类的势力范围)的方法。

松子茶的专栏 3万+

C++ 枚举转字符串

用#宏,见代码 #include <iostream> #define enum_to_string(x) #x enum sex { boy, girl, }; int main() { std::cout << enum_to_string(sex::boy) << std::endl; ...

aibulie0537的博客 3749

【Basis】Lumerical licence center 无法连接的问题

端口,我们需要确认该端口是否被其他程序占用。这里我们将介绍如何处理这一问题。后,今天电脑更新后我无法打开。终结占用该端口的程序后再次打开。

u011699626的博客 313

枚举与字符串映射

代码: #import <Foundation/Foundation.h> typedef NS_ENUM(NSUInteger, NetworkStatus){ NetworkStatusGood = 0, NetworkStatusBad }; NSString * const NetworkStatusNameMapping[] ...

a3031615的博客 925

Hermes Agent 常见报错排查与问题解决

Hermes Agent 常见报错排查指南 摘要 本文全面梳理了 Hermes Agent 使用过程中的10类常见报错,按阶段划分为安装期、运行期认证类、后端基础设施类和长任务执行类四大类,并提供了系统化的排查流程: 安装期问题:包括命令未找到和Python版本不兼容,主要检查PATH环境和Python版本是否符合要求 认证类问题:涉及API Key认证失败和速率限制,需要验证密钥配置和配额状态 基础设施问题:包含Docker报错、MCP连接失败和OAuth令牌过期,需检查相关服务状态 执行类问题:主要是上

简简单单Onlinezuozuo 1343

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

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

C++ 把枚举变量的名称,直接当字符串使用方法 字符串化符号 #

#include <stdio.h> #include <typeinfo> #include <string> using namespace std; enum type{FLASH, ONCE}; string Setstr(const char * val) { return val; } #defin...

dongbi0665的博客 812

ssm框架搭建

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

Qt5 枚举名与字符串互转

qt5 枚举名与字符串互转

gaoyuelong的博客 429

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

枚举、字符串、值之间的转换

public enum Fruit { banana=1, apple=2, orange=3 } //枚举转字符串 string enumString=Enum.GetName( typeof(Fruit) ,fruit); //枚举转值 int enumValue1=fruit.GetHashCode(); int enumValue...

weixin_30778805的博客 138

关于C++枚举类型enum

关于C++枚举类型enum 一、何为枚举类型? 枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。 声明形式: enum 枚举名 {变量列表}; 例如: enum Weekday{SUN,MON.TUE,WED,THU,FRI,SAT}; 定义枚举数据类型变量,例如: Weekday myweekday; (注意数据类型是Weekda...

b558922946211890的博客 405

枚举的遍历和字符串转枚举,枚举转字符串

enum mycity { beijing,shanghai } 枚举的遍历 foreach( mycity city in enum.getvalues( typeof( mycity ) ) ){ }字符串转枚举 mycity enumtype; string strT...

dengguawei0519的博客 154

字符串转枚举

我今天编程的时候发现如下关于“字符串转枚举类型”的问题: 我开始在settings的配置文件里保存配置信息,因为settings的配置文件可以指定数据类型,所以保存了System.Windows.Forms.Keys 类型的数据(即记录键盘的值),可是现在想将数据保存在xml文档里,但是xml文档不能指定数据类型,我就将该数据保存为字符串,可是导出的时候怎么才能将string转成System

u011228126的专栏 684

枚举,以及中文对应解释 转载

  public enum eColor { discus = 0, black=1, red=2 } public string[] strsColor ={ "七彩", "黑色", "大红色"}; public string GetColor(eColor em)...

anduoji8601的博客 337

C/C++枚举enum分别打印输出枚举子和枚举值的方法

关于枚举枚举的基础概念我这里不再介绍,感兴趣的同学可以查阅另一篇博文C/C++中枚举类型enum使用。这里我主要提一下在调试一个大型程序中遇到日志打印中一个关于枚举输出的小错误。   我们知道枚举分为枚举子和枚举值,就相当于键与值的对应关系。例如下面的枚举变量:enum Example {FIRST,SECOND,THIRD}; // 三个枚举子对应枚举值默认是0,1,2。  那如何输出枚举值和枚

无鞋童鞋的博客 5万+

QT中enum和QString的互相转换。

1、使用Q_ENUM宏注册(注意:1、必须继承QObject, 2、在QT5.5版本引入) #include <QObject> class Cenum: public QObject { Q_OBJECT public: Cenum() {} enum Priority { High, ...

weixin_34221073的博客 3668
上一篇: windows mobile 菜单处理
下一篇: (转)C++编写Config类读取配置文件
berkshirman
博客等级 码龄19年 41粉丝 41原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值