【问题标题】:Equivalent of .values() of enum from Java in C++等效于 C++ 中 Java 中枚举的 .values()
【发布时间】:2014-03-13 13:47:53
【问题描述】:

我最初是学习用 Java 编程的,因此在使用枚举时,我可以使用 .values() 来生成该特定枚举中所有值的数组。我注意到现在学习C++,没有等效的方法。

我确信人们已经提出了不错的解决方法,因此解决此问题的最佳方法是什么?

【问题讨论】:

  • 侧边栏/相关:stackoverflow.com/q/261963/420683 C++11 中没有这样的功能。您可以添加一个哨兵枚举器并依赖枚举器的连续性,或者使用一些预处理器魔法。
  • 枚举是程序中有意义的常量。如果你在编译时不知道你有什么常量,我有坏消息要告诉你。这就像忘记常数 0、1、2、3、4、5、6、7、8 和 9 组成一个数字。也就是说,enum 常量通常用于区分配置或为您可能需要执行不同操作的每个选项提供一组选项。如果您可以编写可以处理enum 值的代码,无论将来添加什么,您可能一开始就不想使用enum
  • 这不是一个简单的方法。无论解决方案如何,我认为这一切都将非常“骇人听闻”。
  • @JoachimPileborg 是的,我很可能期待这个哈哈。
  • C++ 中没有这样的功能。

标签: c++ arrays enums enumeration


【解决方案1】:

在 C++ 中执行此操作通常需要枚举中的特殊标记值或一些预处理器魔法。

如果您的枚举器是连续的,那么您可以使用简单的标记值(在这种情况下为end):

enum my_enum {
    a,
    b,
    c,
    my_enum_end,
};

for (int i = 0; my_enum_end != i; ++i) {
    // Loop through all of the enum values.
}

当枚举比较复杂并且每个枚举器之间存在间隙时,您可以使用预处理器:

#define ENUMS(F) F(a, 1) F(b, 5) F(c, 10)
#define AS_ENUM(ID, V) ID = V,
#define AS_VALUE(ID, V) V,
#define AS_ID(ID, V) #ID,

enum my_enum {
    ENUMS(AS_ENUM)
};

my_enum const my_enum_values[] = {ENUMS(AS_VALUE)};
std::string const my_enum_keys[] = {ENUMS(AS_ID)};

for (my_enum const i : my_enum_values) {
    // Loop through all of the enum values.
}
for (auto const& i : my_enum_keys) {
    // Loop through all of the enum keys.
}

这里所有的枚举器都在ENUMS 宏中指定,而不是直接在enum 定义中。

【讨论】:

  • 如果我没记错的话,它正在使用 X 宏。
猜你喜欢
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2010-10-09
相关资源
最近更新 更多