![]() |
1
13
没有内置的解决方案。最简单的方法是使用
|
![]() |
2
61
|
![]() |
3
61
技术来源 Making something both a C identifier and a string? 可以在这里使用。 与通常的预处理器一样,编写和理解预处理器部分可能很困难,包括将宏传递给其他宏,并涉及使用和运算符,但使用它确实很容易。我发现这种样式对于长枚举非常有用,在长枚举中维护同一列表两次确实很麻烦。 工厂代码-仅键入一次,通常隐藏在标题中:枚举:h:
工厂使用H:
CPP:
这种技术可以很容易地扩展,以便xx宏接受更多的参数,您还可以准备更多的宏来代替xx以满足不同的需要,类似于我在这个示例中提供的三个。 使用include/define/undef与X宏进行比较虽然这类似于其他人提到的X宏,但我认为该解决方案更优雅,因为它不需要取消任何标记,这允许您隐藏更多复杂的内容在工厂中头文件-头文件是您在需要定义新枚举时根本不接触的内容,因此新枚举澄清要短得多,而且要干净得多。 |
![]() |
4
13
确实有一种方法可以做到这一点——使用 X() macros . 这些宏使用C预处理器从源数据列表中构造枚举、数组和代码块。您只需要向包含x()宏的定义中添加新项。switch语句将自动展开。 您的示例可以写如下:
有更有效的方法(即使用x宏创建字符串数组和枚举索引),但这是最简单的演示。 |
![]() |
5
8
我知道你有几个很可靠的答案,但是你知道C预处理器中的运算符吗? 它允许您这样做:
|
![]() |
6
6
吻。您将对枚举执行各种其他切换/大小写操作,那么为什么打印会有所不同呢?当你认为有大约100个地方你可以忘记一个案例时,在你的打印程序中忘记一个案例并不是一件大事。只需编译墙,它将警告非详尽的案例匹配。不要使用“默认值”,因为这样会使开关耗尽,并且不会收到警告。相反,让开关退出并像这样处理默认情况…
|
![]() |
7
5
C或C++不提供这个功能,虽然我经常需要它。 下面的代码可以工作,尽管它最适合非稀疏枚举。
我指的是不稀疏的形状
因为这其中有巨大的差距。 这个方法的优点是,它将枚举和字符串的定义放在一起;在函数中有一个switch语句可以将它们放在一起。这意味着你不太可能改变其中一个。 |
![]() |
8
4
尝试 Converting C++ enums to strings . 这个 comments 当枚举项具有任意值时,具有解决问题的改进。 |
![]() |
9
4
使用 boost::preprocessor 提供如下优雅的解决方案: 步骤1:包括头文件:
步骤2:用以下语法声明枚举对象:
第3步:使用数据: 获取元素数:
获取关联字符串:
从关联字符串获取枚举值:
这看起来干净紧凑,没有额外的文件。 我在遗孀中写的代码。h如下:
有一些限制,例如Boost::Preprocessor的限制。在这种情况下,常量列表不能大于64个元素。 遵循相同的逻辑,您还可以考虑创建稀疏枚举:
在这种情况下,语法是:
用法与上面类似(减去ename 2enum函数,您可以尝试从前面的语法中进行推断)。 我在Mac和Linux上测试过它,但请注意,boost::preprocessor可能不是完全可移植的。 |
![]() |
10
3
通过合并这里的一些技术,我得出了最简单的形式:
|
![]() |
11
2
如果您使用GCC,则可以使用:
那就打个电话吧
|
![]() |
12
1
请访问 Mu Dynamics Research Labs - Blog Archive . 今年早些时候我发现了这个——我忘记了我遇到它的确切上下文——并把它改编成了这个代码。我们可以在前面讨论添加e的优点;它适用于所解决的特定问题,但不是一般解决方案的一部分。我把它藏在我的“小插曲”文件夹中——在那里我保存一些有趣的代码片段,以备以后需要。我很不好意思说,当时我没有记录下这个想法是从哪里来的。 标题:Paste1.h
实例来源:
不一定是世界上最干净的使用C预处理器-但它确实阻止了多次写出材料。 |
![]() |
14
0
如果枚举索引基于0,则可以将名称放入char*数组中,并使用枚举值对其进行索引。 |
![]() |
15
0
|
![]() |
16
0
我创建了一个简单的模板类
用途:
|
![]() |
17
0
下面是一个使用宏的解决方案,具有以下功能:
|
![]() |
18
0
我认为像Boost.Fusion这样的解决方案适合于结构和类,它们甚至在某个时刻使用枚举作为融合序列。 所以我做了一些小宏来生成打印枚举的代码。这并不完美,与Boost没有任何关系。Fusion生成样板代码,但可以像Boost Fusion宏那样使用。我真的想生成Boost.Fusion所需的类型,以集成到允许打印结构成员名称的基础结构中,但稍后会发生这种情况,目前这只是宏:
下面的旧答案很糟糕,请不要使用它。:) 老回答:我一直在寻找一种在不改变太多枚举声明语法的情况下解决这个问题的方法。我找到了一个使用预处理器从字符串化枚举声明中检索字符串的解决方案。 我可以这样定义非稀疏枚举:
我可以用不同的方式与他们互动:
基于以下定义:
当我需要对稀疏枚举的支持时,当我有更多的时间时,我将改进 托弦 和 从字符串 使用boost::xpressive实现,但这将花费编译时间,因为执行了重要的模板化,生成的可执行文件可能会更大。但这有一个优点,即它比这个丑陋的手动字符串操作代码更易于阅读和维护。 D 否则,我总是使用boost::bimap在枚举值和字符串之间执行这种映射,但必须手动维护它。 |
![]() |
Community wiki · C中有哪些耗时的操作? 1 年前 |
![]() |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
![]() |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
![]() |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |