“枚举类”的增加和减少

时间:2013-03-16 15:14:31

标签: c++ c++11 enums

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

这样的东西
enum class Colors { Black, Blue, White };
// ...
Colors color = Colors::White;
color++;

并且它会正常工作(例如,White的增量将返回Black并且Black的递减将返回White)?

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

1 个答案:

答案 0 :(得分:24)

  

它会正常工作吗

没有。 enum的设计并非按照您默认描述的方式“环绕”。

而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;
}