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)
enum Some
{
Some_first_ = 0,
Some_Alpha = Some_first_,
....
Some_last_
};
Run Code Online (Sandbox Code Playgroud)
这样做你可以授予第一个和最后一个永远不会改变的顺序
| 归档时间: |
|
| 查看次数: |
7835 次 |
| 最近记录: |