迭代枚举值是否有任何众所周知的范例?

Sad*_*ido 12 c++ iteration enums

我有一些C++代码,其中声明了以下枚举:

enum Some 
{
   Some_Alpha = 0,
   Some_Beta,
   Some_Gamma,
   Some_Total
};
int array[Some_Total];
Run Code Online (Sandbox Code Playgroud)

Alpha,Beta和Gamma的值是顺序的,我很乐意使用以下循环来迭代它们:

for ( int someNo = (int)Some_Alpha; someNo < (int)Some_Total; ++someNo ) {}
Run Code Online (Sandbox Code Playgroud)

这个循环没问题,直到我决定改变枚举中声明的顺序,比如说,使Beta成为第一个值,而Alpha - 第二个.这使循环标头无效,因为现在我必须从Beta迭代到Total.那么,迭代枚举的最佳实践是什么?我希望迭代所有值,而不是每次都更改循环标题.我能想到一个解决方案:

enum Some 
{
   Some_Start = -1,
   Some_Alpha,
   ...
   Some_Total
};
int array[Some_Total];
Run Code Online (Sandbox Code Playgroud)

并从(Start + 1)迭代到Total,但它看起来很难看,我从未见过有人在代码中这样做.是否有任何众所周知的范例来迭代枚举,或者我只需要修复枚举值的顺序?(让我们假装,我真的有一些很棒的理由来改变枚举值的顺序)......

sbi*_*sbi 13

你可以operator++()为你定义一个enum.这具有以下优点:它使用标准增量运算符的众所周知的范例.:)

根据您的枚举是否连续,您可以将它们视为int或使用开关:

Some& operator++(Some& obj)
{
# if YOUR_ENUMS_ARE_CONTIGUOUS
  int i = obj;
  if( ++i > Some_Total ) i = Some_Alpha;
  return obj = static_cast<Some>(i);
# else 
  switch(obj)
  {
    case Some_Alpha : obj = Some_Beta;  break;
    case Some_Beta  : obj = Some_Gamma; break;
    case Some_Gamma : obj = Some_Total; break;
    case Some_Total : obj = Some_Alpha; break;
    default: assert(false); // changed enum but forgot to change operator
  }
  return obj;
# endif
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果operator++()已定义,用户可能也会期望operator--().


小智 5

不,没有办法做到这一点,因为不能保证有人没有编写过如下代码:

enum Some 
{
   Some_Alpha = 0,
   Some_Beta,
   Some_Gamma = 42,
   Some_Delta, 
  Some_Total
};
Run Code Online (Sandbox Code Playgroud)


Dew*_*wfy 0

enum Some
{
   Some_first_ = 0,
   Some_Alpha = Some_first_,
....
   Some_last_
};
Run Code Online (Sandbox Code Playgroud)

这样做你可以授予第一个和最后一个永远不会改变的顺序