C ++枚举中的最大值和最小值


81

有没有办法找到C ++中枚举的最大和最小定义值?



1
我可能想知道一个枚举的最大值而不将其添加到枚举本身的原因之一是,当我的'switch'语句未显式处理“ max value”值时,我的编译器不会抱怨(C4061)。
snips-n-snails

Answers:


94

不,无法找到C ++中任何枚举的最大和最小定义值。当需要此类信息时,通常最好的做法是定义一个Last和First值。例如,

enum MyPretendEnum
{
   Apples,
   Oranges,
   Pears,
   Bananas,
   First = Apples,
   Last = Bananas
};

First和之间的每个值都不需要命名值Last


3
对于非顺序枚举仍然有用-只要您不希望每个值都存在
Adrian Cornish 2012年

@Adrian:是的,是的。您不需要每个值都有定义的名称,此技术就可以使用。我将进行相应的编辑
Jeff Yates 2012年

好的,但是如果添加新值,则必须保持其价值。
马特

30

不,不是在标准C ++中。您可以手动执行以下操作:

enum Name
{
   val0,
   val1,
   val2,
   num_values
};

num_values 将包含枚举中的值数。


num_values将包含数值的数字1
4pie0 2014年

12
@lizusek:num_values将包含枚举中的值数,除了num_values它本身。
dalle 2014年

3
@dalie是的,这就是它的原因:值的数量-1.当然,我知道您是指一个值,该值表示不包括最后一个值的值,该值不是实际值,而是助手。但是,我建议使其更加清晰。
2014年

1
@dalle仅当val0 = 0
user2470258

@ user2470258它如上所定义始终为0。
装饰板

6

不。C或C ++中的枚举只是一个常量列表。没有更高的结构可以保存此类信息。

通常,当我需要此类信息时,我会在枚举中包含以下最大值和最小值:

enum {
  eAaa = 1,
  eBbb,
  eCccc,
  eMin = eAaaa,
  eMax = eCccc
}

有关如何使用它的一些示例,请参见此网页:愚蠢的枚举技巧


您链接的文章来自作者编译器“不支持新的正式C ++布尔类型”的时代。...我从未读过:P之前的文章。
idclev 463035818

4
  enum My_enum
    {
       FIRST_VALUE = 0,

       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,

       LAST_VALUE
    };

定义后,My_enum :: LAST_VALUE == N + 1


-1

不是自动的,但是您可以添加人工枚举值来表示最小值和最大值,例如

typedef enum {start_of_colors=-1, eRed, eWhite, eBlue, eGray,
end_of_colors} eListOfTags;

for (eListOfTags i = start_of_colors+1; i < end_of_colors; i++) {
.... 
}

1
考虑添加说明以帮助答案。
Bibberty

-5

您甚至不需要它们,我只是想举例说,如果您有:

enum Name{val0,val1,val2};

如果您有switch语句,并检查是否达到最后一个值,请执行以下操作:

if(selectedOption>=val0 && selectedOption<=val2){

   //code
}

15
这是一个非常脆弱的解决方案。如果添加新的枚举值,则必须调查整个代码库以更新此类测试。
Marcelo Cantos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.