有没有一种简单的方法将 C++ 枚举转换为字符串?

2024-03-28

假设我们有一些命名枚举:

enum MyEnum {
      FOO,
      BAR = 0x50
};

我在谷歌上搜索的是一个脚本(任何语言),它扫描我的项目中的所有标头并生成每个枚举具有一个函数的标头。

char* enum_to_string(MyEnum t);

以及类似这样的实现:

char* enum_to_string(MyEnum t){
      switch(t){
         case FOO:
            return "FOO";
         case BAR:
            return "BAR";
         default:
            return "INVALID ENUM";
      }
 }

真正的问题在于类型定义的枚举和未命名的 C 风格枚举。有人知道这方面的事情吗?

编辑:除了生成的函数之外,解决方案不应修改我的源代码。枚举位于 API 中,因此使用迄今为止提出的解决方案并不是一种选择。


X 宏是最好的解决方案。例子:

#include <iostream>

enum Colours {
#   define X(a) a,
#   include "colours.def"
#   undef X
    ColoursCount
};

char const* const colours_str[] = {
#   define X(a) #a,
#   include "colours.def"
#   undef X
    0
};

std::ostream& operator<<(std::ostream& os, enum Colours c)
{
    if (c >= ColoursCount || c < 0) return os << "???";
    return os << colours_str[c];
}

int main()
{
    std::cout << Red << Blue << Green << Cyan << Yellow << Magenta << std::endl;
}

颜色.def:

X(Red)
X(Green)
X(Blue)
X(Cyan)
X(Yellow)
X(Magenta)

然而,我通常更喜欢以下方法,这样就可以稍微调整字符串。

#define X(a, b) a,
#define X(a, b) b,

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

有没有一种简单的方法将 C++ 枚举转换为字符串? 的相关文章

随机推荐

  • 我可以在oracle中创建参数化视图吗

    我有一个这样的查询 SELECT ID REF ID BATCHNO FROM reporttbl where POSTING DT gt 06 01 2020 and POSTING DT lt 06 30 2020 我每个月都需要它 所
  • 为什么 Android 的 HttpUrlConnection 不支持 HTTP/2?

    我刚刚发现Android推荐的http客户端HttpUrlConnection不支持 HTTP 2 是否有特定原因不在 Android 上使用 HTTP 2 如果你想利用 HTTP 2 你可以使用 OkHttp https github c
  • SQL 一对多匹配多侧中的一侧 by ALL

    在下面的一对多中 CREATE TABLE source id int name varchar 10 PRIMARY KEY id CREATE TABLE params id int source int value int 其中 pa
  • 对数据进行分组并绘制多条线

    我想在 R 中为此数据集绘制多条线 x Year y Value School ID Year Value A 1998 5 B 1998 10 C 1999 15 A 2000 7 B 2005 15 每个学校都有不同年份的数据 我希望每
  • 设置输入占位符的样式,我该怎么做? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 CSS 更改输入的 HTML5 占位符颜色 https stackoverflow com questions 2610497 change an inputs html5 placeholde
  • 如何将 argv[] 获取为 int?

    我有一段这样的代码 int main int argc char argv printf d t int argv 1 printf s t int argv 1 在外壳中我这样做 test 7 但第一个 printf 结果不是 7 我怎样
  • fscanf 无法正确读取浮点数

    这是一个家庭作业问题 我在使用 fscanf 从文本文件读取浮点值时遇到问题 基本上我试图从文件中读取浮点值并将它们存储在动态数组中 输入文件每行有两个浮点数 所以一行可能是 0 85 7 34 不带引号 所以我尝试使用 fscanf fp
  • 如何使用flask-ReSTplus记录帖子正文?

    如何记录预期发布的输入正文value字段出现以便用户知道要发布什么 目前使用以下数据 customer id service id customer name site name service type 我们可以使用上面的 json 来默
  • 将同步代码包装为异步任务的最佳方法是什么?

    我正在实现一个异步接口方法 返回任务 然而 我的实现必然是同步的 最好的方法是什么 有一些内置的方法可以做到这一点吗 以下是我正在考虑的几个选项 选项 1 Task FromResult return Task FromResult Com
  • 如何轮询目录以检查是否添加了新文件?

    我想轮询一个目录以检查是否有新文件添加到该目录中 如果添加了任何新文件 我想读取该文件 有人可以告诉我如何做到这一点吗 Java 7 有一个文件观察器API http java dzone com news how watch file s
  • 将 datetimeoffset 数据类型与 jTDS 结合使用

    jTDS 目前不支持datetimeoffsetSQL Server 2008 中引入的数据类型 任何人都可以建议是否有办法使用datetimeoffset使用 jTDS 键入 正如在 下层客户端的向后兼容性 部分中提到的日期时间偏移文档
  • Protobuf.net“一旦生成序列化器,就无法更改类型”

    我有一些使用 Protobuf net 的相当简单的代码 它抛出了一个非常奇怪的异常 在 MetaType cs 的第 167 行中 它抛出 InvalidOperationException 一旦生成序列化程序 就无法更改类型 这是什么意
  • 单击按钮时切换弹出模式

    我在页面上显示包含多个项目的弹出窗口时遇到问题 本质上 它是页面下方项目的垂直 列表 到目前为止我有两个 当我单击第一个项目时 第一组信息会正确显示 但是当我单击第二个项目时 它会在弹出窗口中显示第一组信息 任何帮助表示赞赏 谢谢 docu
  • AVFoundation 点击​​聚焦反馈矩形

    我正在开发一个 iPhone 应用程序 我直接使用 AVFoundation 通过相机捕获视频 我已经实现了一项功能来启用tap to focus为用户提供的功能 void focus CGPoint aPoint if HAS AVFF
  • 使用 webpack 和 React 模块解析失败,即使使用 babel-loader

    我正在尝试将 webpack 与 React 一起使用 但收到此错误 app main js 中出现错误 Module parse failed Users me app main js Line 2 Unexpected token Yo
  • gcc 警告:标量初始值设定项周围有大括号

    我有如下定义的查找表 并且正在使用 GCC 当我编译时 我收到警告 warning braces around scalar initializer 这个警告是什么意思 我应该如何初始化这个LUT 我在初始化这个结构时犯了错误吗 Help
  • 如何在 Google Colaboratory 的 Jupyter Notebook 中安装 svmutil?

    我想使用 svmutil 函数https github com Netflix vmaf tree master libsvm python https github com Netflix vmaf tree master libsvm
  • 为整个 iOS 应用程序快速使用自定义字体

    我知道要在屏幕上设置元素的自定义字体我可以简单地执行以下操作someLabel font UIFont name Exo 2 0 size 15 我想知道如何使用 swift 为整个应用程序设置它 一种黑客方法是对应用程序的每个元素执行我所
  • FLTK简单动画

    我可以成功编译并运行 Hello World 代码 现在我想做一些像动画这样的事情 我首先创建一个矩形类来实现 Fl widget 中的 draw class myRect public Fl Widget private Fl Color
  • 有没有一种简单的方法将 C++ 枚举转换为字符串?

    假设我们有一些命名枚举 enum MyEnum FOO BAR 0x50 我在谷歌上搜索的是一个脚本 任何语言 它扫描我的项目中的所有标头并生成每个枚举具有一个函数的标头 char enum to string MyEnum t 以及类似这