在C++中迭代连续枚举值的最简单方法

Pau*_*l R 16 c++ enums for-loop

在C++中使用连续值迭代枚举的首选简单方法是什么?我之前发现了关于这个主题的SO问题,其中涉及创建自定义operator++等,但这看起来有点矫枉过正.到目前为止,我提出的最好的是:

enum {
   FOO,
   BAR,
   BLECH,
   NUM_ENUMS
} MyEnum;

//for (MyEnum m = FOO; m < NUM_ENUMS; ++m)             // compile error
//    ...

//for (MyEnum m = FOO; m < NUM_ENUMS; m = m + 1)       // compile error
//    ...

for (MyEnum m = FOO; m < NUM_ENUMS; m = MyEnum(m + 1)) // OK ?
    ...
Run Code Online (Sandbox Code Playgroud)

从编码风格的角度看这是否合理,是否可能产生警告(g++ -Wall ...对此感到高兴)?

Mat*_* M. 14

这确实很安全.

这可能是未定义的:MyEnum(int(NUM_ENUMS) + 1)因为hold(4)的值将大于枚举可以表示的值([0,3]); 因为你确保m严格低于NUM_ENUMS使用安全MyEnum(m + 1).

另一方面,请注意您会遇到自定义枚举的问题,例如:

enum OtherEnum {
    Foo = -1,
    Bar = 2,
    Baz = 8,
    NUM_OTHERENUM
};
Run Code Online (Sandbox Code Playgroud)

所以这不是一般做法.

我会建议生成的数组迭代:

MyEnum const Values[] = { FOO, BAR, BLECH };
Run Code Online (Sandbox Code Playgroud)

请注意,它很容易从枚举的定义中生成,并且还避免使用无意义的值(业务方面)污染接口.