27

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

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

它会正常工作吗(例如 will return 的增加和will WhitereturnBlack的减少)?BlackWhite

如果我们不能编写这样的代码,您是否知道来自boost或来自Qt为我们提供此功能的任何类似行为的类(正确的递增和递减)?

4

1 回答 1

32

它会正常工作吗

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

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

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

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;
}
于 2013-03-16T15:23:34.593 回答