【问题标题】:How to iterate over all elements of an enum in C++98如何在 C++98 中遍历枚举的所有元素
【发布时间】:2021-01-05 09:10:22
【问题描述】:

引用this 的问题,我问,在 C++98 中迭代所有枚举值的最佳方法是什么(一般来说,最不容易出错的方法)?

C++98 的局限性:

  • 没有枚举类
  • 没有 foreach 循环

解决方案中应该避免什么(我很确定,不是所有事情都可以避免):

  • A) 掩码标准语言功能的宏(例如#define CREATE_ENUM(...)
  • B) 包括其他标题
  • C) 代码重复
  • D) 仅为迭代添加枚举元素
  • E) 枚举布局假设(例如,始终递增 1,最后一个元素始终为 XXX)

【问题讨论】:

  • 这个问题(以及链接的问题)似乎是基于错误的假设,即所有可能的枚举元素都是在定义枚举时在{ } 之间列出的元素。
  • @user7860670 有趣!你能提供一个稍后如何指定枚举元素的例子吗?
  • 例如,如果您有enum t_Values { a /* 0 */, b /* 1 */, c /* 2 */ };,那么即使未列出,3 也是有效的枚举值。
  • 好吧,如果我们接受所有适合枚举的内容,我们可以从 INT_MIN 循环到 INT_MAX。我的意图确实是,遍历枚举定义中声明的所有元素
  • “如果我们接受所有适合枚举的内容,我们就可以从 INT_MIN 循环到 INT_MAX” - 不是真的。迭代枚举定义中列出的命名值与迭代任何其他任何类型的已知值组没有什么不同。

标签: c++ enums c++98


【解决方案1】:

没有办法实现你所有的 A..E。你可以实现:

  • BCDE 使用宏(例如#define CREATE_ENUM(...))。
  • ABDE 通过将所有元素存储在一个数组中
  • ABC 仅使用从 0 开始的结果并添加额外元素来表示计数(如 here 所示)或更一般地,可以表示为数学序列的值。

请注意,就当前 C++ 标准中的这些点而言,枚举类和 range-for 循环都不会带来任何可以扩大您选择范围的东西。

【讨论】:

    【解决方案2】:

    当时的惯用伎俩是这样做:

    enum Foo {
      One,
      Two,
      Three,
      Last,
      MAX_FOO_ENUM
    };
    
    for( int it = One; it < MAX_FOO_ENUM; ++it )
    ...
    

    当然,只有在 Foo 中没有跳过时它才能正确工作。除非您定义某种容器,其中的元素等于 Foo 的每个值,否则您无法正确执行此操作,但对于以后的标准也是如此。

    【讨论】:

    • 不批评(这是一个有效的解决方案),只是指出:它失败了 D 点和 E 点。
    • @kuga C, D 在 C++11 中得到解决。在 C++98 中它们是不可解的,E 基本上是不可解的,除非您使用某种模板来遍历值。这就像试图解决缺少可变参数模板的问题。微软对std::tuple 这样做了。通过宏并将元组限制为 16 个元素。 :P
    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多