众所周知,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
)?
如果我们无法编写此类代码,您是否知道boost
或Qt
中提供此功能的任何类似行为的类(正确的输入和递减)?
答案 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;
}