C++ 增加和减少“;枚举类”;

C++ 增加和减少“;枚举类”;,c++,c++11,enums,C++,C++11,Enums,正如我们所知,在C++03中增加和减少enum是非法的,因为C++03enum可能不是连续的。但是C++11标准引入了新的enum类结构,根据维基百科的说法,它更安全,因为它不是基于任何简单的可数类型构建的。那么现在,如果我们有一个枚举值的有界列表,我们可以写这样的东西吗 enum class Colors { Black, Blue, White }; // ... Colors color = Colors::White; color++; 它是否能正常工作(例如,White的递增将返回B

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

enum class Colors { Black, Blue, White };
// ...
Colors color = Colors::White;
color++;
它是否能正常工作(例如,
White
的递增将返回
Black
,而
Black
的递减将返回
White

如果我们不能编写这样的代码,您是否知道
boost
Qt
中的类这样的行为为我们提供了此功能(正确的输入和递减)?

它能正常工作吗

否。
enum
s不是按照您默认描述的方式设计的

C++11的
enum类
不保证连续值,这与您描述的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;
}
enum类颜色{黑、蓝、白、列表末尾};
//颜色的特殊行为
颜色和运算符++(颜色和c){
使用IntType=typename std::底层类型::type
c=静态施法(静态施法(c)+1);
if(c==颜色::结束\u列表)
c=静态压力(0);
返回c;
}
//颜色的特殊行为++
颜色运算符++(颜色和c,int){
颜色结果=c;
++c;
返回结果;
}

没有什么可以说类枚举的值是连续的。在这方面,它们与C++03枚举相同。@juanchopanza的可能重复:C++03枚举肯定继承了按顺序赋值的C行为。没有初始值设定项的每个枚举项都是前一项+1。如果第一个没有初始值设定项,则其值为零。这是完全保证和标准的,从有标准以来一直如此。参见第7.2P2节谁告诉过您,
enum类
不是基于基整数类型构建的?唯一的区别是,现在您可以选择自己选择基类型,而不是编译器以依赖于实现的方式进行选择。枚举的可表示值范围始终是连续的。该范围内的哪些值具有明确的名称,哪些值不具有明确的名称是完全无关的。不能在enum objct中使用上述运算符的事实与其连续性无关。这如何处理非连续值?@juanchopanza只是因为我们可以观察到没有。有没有一种方法可以在不使用强制转换的情况下实现
++
?我想不出有什么,但是这个实现让我很烦恼。强制类型转换通常是错误的指示,使用强制类型转换必须有很好的理由。我希望该语言允许实现
++
而无需强制特定类型。那么非连续
枚举类
呢?在允许的值范围内进行迭代是一个非常自然的操作,即使使用强制转换,我也看不到实现它的方法。@icepack这是因为没有<因此,代码>枚举在大多数情况下都不是一个特别有用的构造。