获取枚举的最大值

Getting the highest value of an enum

本文关键字:最大值 枚举 获取      更新时间:2023-10-16

我有一个c++代码,它使用bitset来存储在我的数据结构中找到的枚举值(它实际上有点复杂,但这对问题无关紧要)。

这意味着当我有一个像这样的enum:

enum Color
   {
     RED
   , GREEN
   , BLUE
   };
我想这样定义我的bitset:
std::bitset<3>

当然我不想硬编码值3

在某些情况下,我可以简单地在枚举中添加一个"终止符",如下所示:

enum Color
   {
     RED
   , GREEN
   , BLUE
   , _COLOR_TERMINATOR
   };

我可以这样写:

std::bitset<_COLOR_TERMINATOR>

但是我不能在所有的枚举中都这样做。如果我在我的一些枚举上这样做,代码检查器(如Lint)会抱怨不是所有的枚举值都在switch语句中使用。

是否有一种方法可以在不改变枚举本身的情况下获得枚举中的最大值?例如,std::max<Color> ?

使用Visual Studio 2013和c++。

谢谢。

也许你可以为你的枚举使用一个专门的trait来添加最大定义值

template<class T> struct top_bound;
template<> struct top_bound<Color>{ static const size_t value = 3;};

std::bitset<top_bound<Color>::value> my_bitset;

你仍然需要在每次枚举改变时改变trait,但是你只有一个显式的地方去做。

如果你写了下面的代码,你的lint版本会报错吗?

enum Color
 {
   RED
 , GREEN
 , BLUE
 , LAST_COLOR = BLUE
 };

LAST_COLOR的这个定义相对容易维护(您只需要在末尾添加或删除颜色时更改它,而不是在其他地方插入或删除颜色时更改它,并且当插入或删除颜色强制您更改两行时,它们至少是连续的代码行)。然后你可以写,例如,

std::bitset<LAST_COLOR + 1>

或者,在定义了enum Color之后,立即使用

static const size_t _COLOR_TERMINATOR = BLUE + 1;