为什么我不能增加枚举类型的变量?

Bee*_*and 18 c++

我有一个枚举类型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)

  • @BeeBand:我不同意.可能有十分之五的教科书"enum"示例类似于"enum month {Jan,Feb,...,Dec};",因此是可以增加的枚举的完美示例.在做C++的最后> 15年中,我重载了'operator ++`,枚举可能不到五次.但是我已经做到了. (2认同)
  • @GMan和@Martin:``sigh>`你能告诉我我正在度假,坐在花园里,我的笔记本电脑每天跪在地上两次,我懒得开启编译器吗?@BeeBand:很抱歉打错了.值得庆幸的是,社区抓住了这些. (2认同)

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并递增.

  • @sbi:哦,几个月,这会改变一切,因为几个月很简单...坚持下去,当你增加12月时会发生什么?它应该抛出溢出异常,还是应该环绕?你可能很明显会发生什么,但我可能需要不同的功能.关于这个*应该如何工作的问题太多了,语言设计者不允许这样做,并且每个案例都要单独处理. (8认同)
  • @Igor:现在用这个替换你的例子:`enum month ...`.几个月是连续的并且自然地增加.然后怎样呢? (3认同)
  • @Binary:我不确定你的日历,但在这里,12 月之后是 1 月。这与增加 `std::numeric_limits&lt;int&gt;::max()` 时的情况几乎相同。无论如何,__问题不在于为什么会这样__(“哪种方式对我有意义......”),__而是要做什么__(“什么是好的替代品?”)。 (2认同)

unw*_*ind 9

来回往返int是当然显而易见的解决方案,然后你明确表示你明白增加是在"外面"发生的enum:

nextAvail = static_cast<StackID>(static_cast<int>(nextAvail) + 1);
Run Code Online (Sandbox Code Playgroud)

  • 嗯.是的,这是我的另一种选择,我只是认为所有那些演员都会使代码看起来有些混乱. (2认同)