C++ 如何在C++;98

C++ 如何在C++;98,c++,enums,c++98,C++,Enums,C++98,参考这个问题,我问,在C++98中迭代所有枚举值的最佳方法(通常是最不容易出错的方法)是什么 C++98的局限性: 没有枚举类 无foreach循环 解决方案中应该避免什么(我很确定,不是所有的事情都可以避免): A) 宏屏蔽标准语言功能(例如#define CREATE_ENUM(…)) B) 包括其他标题 C) 代码重复 D) 仅为迭代添加枚举元素 E) 枚举布局的假设(例如,始终递增1,最后一个元素始终为XXX) 当时的惯用伎俩是: enum Foo { One, Two,

参考这个问题,我问,在C++98中迭代所有枚举值的最佳方法(通常是最不容易出错的方法)是什么

C++98的局限性:

  • 没有枚举类
  • 无foreach循环
解决方案中应该避免什么(我很确定,不是所有的事情都可以避免):

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

    • 当时的惯用伎俩是:

      enum Foo {
        One,
        Two,
        Three,
        Last,
        MAX_FOO_ENUM
      };
      
      for( int it = One; it < MAX_FOO_ENUM; ++it )
      ...
      
      enum Foo{
      一,,
      二,,
      三,,
      最后,,
      MAX_FOO_ENUM
      };
      for(int it=1;it

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

      无法实现所有的A..E。你可以做到:

      • 使用宏进行BCDE(例如
        #定义创建枚举(…)
      • 通过将所有元素存储在一个数组中进行ABDE
      • ABC只使用从0开始的consequentive并添加额外的元素来表示计数(如图所示),或者更一般地,使用可以表示为数学序列的值

      注意,无论是Enm类还是循环范围,都会带来任何选择,这些问题将在当前的C++标准中引起。

      这个问题(以及链接的问题)似乎是基于错误的假设,即所有可能的枚举元素都是在<代码> {}之间列出的。
      定义枚举时。@user7860670有趣!您能否提供一个以后如何指定枚举元素的示例?例如,如果您有
      enum t_值{a/*0*/,b/*1*/,c/*2*/}则3也将是一个有效的枚举值,即使它没有列出。好吧,如果我们接受符合枚举的所有内容,我们可以从INT_MIN循环到INT_MAX。我的意图确实是,迭代de enum定义中声明的所有元素。“如果我们接受符合枚举的所有内容,我们可以从INT_MIN循环到INT_MAX”-不是真的。对枚举定义中列出的命名值进行迭代与对任何类型的任何其他已知值组进行迭代没有什么不同。不是批评(这是一个有效的解决方案),只是要指出:它失败了点D和E。@kuga C,D在C++11中得到了解决。在C++98中,它们是不可解的,本质上是不可解的,除非您使用某种模板来迭代值。这就像试图解决缺少可变模板的问题。微软这样做是为了
      std::tuple
      。通过宏并将元组限制为16个元素:P