我有一个枚举类型StackID,我使用枚举来引用特定向量的索引,它使我的代码更容易阅读.
但是,我现在需要创建一个名为nextAvailtype 的变量StackID.(它实际上指的是特定的stackID).我尝试增加它,但在C++中,以下是非法的:
nextAvail++;
Run Code Online (Sandbox Code Playgroud)
哪种对我有意义...因为没有界限检查.
我可能忽略了一些明显的东西,但什么是一个很好的替代品呢?
我也想链接到这个问题.
sbi*_*sbi 26
我可能忽略了一些明显的东西,但什么是一个很好的替代品呢?
重载operator++:
// Beware, brain-compiled code ahead!
StackID& operator++(StackID& stackID)
{
#if MY_ENUMS_ARE_CONTIGUOUS && I_DO_NOT_WORRY_ABOUT_OVERFLOW
return stackID = static_cast<StackID>( ++static_cast<int>(stackID) );
#else
switch(stackID) {
case value1 : return stackID = value2;
case value2 : return stackID = value3;
...
case valueN : return stackID = value1;
}
assert(false);
return stackID; // some compilers might warn otherwise
#endif
}
StackID operator++(StackID& stackID, int)
{
StackID tmp(stackID);
++stackID;
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
Igo*_*aka 17
因为枚举不必是连续的.举个例子:
enum Colors {
cRed, // = 0
cBlue, // = 1
cGreen = 3
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下会发生什么?
Colors color = cBlue;
Colors other = color++;
Run Code Online (Sandbox Code Playgroud)
其他应该是cGreen或应该是2.在这种情况下,它不再是有效的枚举成员.那这个呢?
Colors color = cGreen;
Colors other = color++;
Run Code Online (Sandbox Code Playgroud)
应该other可以cRed(环绕)或4?
正如您所看到的,能够增加枚举值会引入大量问题,并使他们想要的简单机制变得复杂.
如果你关心的是整数值递增,那么只需转换为int并递增.
来回往返int是当然显而易见的解决方案,然后你明确表示你明白增加是在"外面"发生的enum:
nextAvail = static_cast<StackID>(static_cast<int>(nextAvail) + 1);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31536 次 |
| 最近记录: |