【问题标题】:Incrementation and decrementation of “enum class”“枚举类”的递增和递减
【发布时间】:2013-03-16 15:14:31
【问题描述】:

众所周知,C++03中enum的递增和递减是非法的,因为C++03的enum可能不是连续的。但是 C++11 标准引入了新的 enum class 构造,根据 Wikipedia 的说法,它更加类型安全,因为它不是基于任何简单的可数类型构建的。所以现在,如果我们有一个枚举值的有界列表,我们可以写类似

enum class Colors { Black, Blue, White };
// ...
Colors color = Colors::White;
color++;

它是否可以正常工作(例如,White 的递增将返回 BlackBlack 的递减将返回White)?

如果我们无法编写此类代码,您是否知道 boostQt 中的任何类似行为的类为我们提供了此功能(正确的递增和递减)?

【问题讨论】:

  • 没有什么可以说类枚举的值是连续的。在这方面,它们与 C++03 枚举相同。
  • @juanchopanza:C++03 枚举肯定继承了按顺序分配值的 C 行为。每个没有初始值设定项的枚举项是前一项 + 1。如果第一个项没有初始值设定项,则它的值为零。这是完全有保证和标准的,并且自有标准以来一直如此。见第 7.2p2 节
  • 谁告诉你enum class 不是基于基本整数类型构建的?唯一的区别是现在您可以选择自己选择基本类型,而不是编译器以依赖于实现的方式进行。
  • 枚举的可表示值的范围始终是连续的。该范围内的哪些值具有明确的名称,哪些没有是完全不相关的。不能将上述运算符与枚举对象一起使用这一事实与它的连续性无关。

标签: c++ c++11 enums


【解决方案1】:

它会正常工作

没有。 enums 并非旨在以您默认描述的方式“环绕”。

并且 C++11 的 enum class 不保证连续值,就像您为 C++03 的 enum 描述的一样。

您可以为您的特定枚举定义包装行为。 此解决方案假定值 是连续的,就像您描述的枚举一样。

enum class Colors { Black, Blue, White, END_OF_LIST };

// Special behavior for ++Colors
Colors& operator++( Colors &c ) {
  using IntType = typename std::underlying_type<Colors>::type
  c = static_cast<Colors>( static_cast<IntType>(c) + 1 );
  if ( c == Colors::END_OF_LIST )
    c = static_cast<Colors>(0);
  return c;
}

// Special behavior for Colors++
Colors operator++( Colors &c, int ) {
  Colors result = c;
  ++c;
  return result;
}

【讨论】:

  • 如何处理不连续的值?
  • @juanchopanza 只是因为我们可以观察到没有。
  • 有没有办法在没有强制转换的情况下实现++?我想不出来,但这个实现让我很困扰。演员表通常表明有问题,并且必须有一个很好的理由来使用它们。我希望该语言能够实现++ 的实现,而无需强制使用特定类型。
  • 那么不连续的enum class呢?对一系列允许值进行迭代是一种非常自然的操作,即使使用强制转换,我也看不到实现它的方法。
  • @icepack 那是因为没有。因此,enums 在大多数情况下并不是特别有用的构造。
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2020-12-11
相关资源
最近更新 更多