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

时间:2008-10-01 18:27:27

标签: c++ enums

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

7 个答案:

答案 0 :(得分:85)

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

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

FirstLast之间的每个值都不需要命名值。

答案 1 :(得分:27)

不,不是标准的C ++。你可以手动完成:

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

num_values将包含枚举中的值数。

答案 2 :(得分:5)

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

通常当我需要这种信息时,我在枚举中包含这样的最大值和最小值:

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

请参阅此网页,了解有关如何使用此功能的一些示例:Stupid Enum Tricks

答案 3 :(得分:3)

  enum My_enum
    {
       FIRST_VALUE = 0,

       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,

       LAST_VALUE
    };

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

答案 4 :(得分:0)

尽管接受的答案正确地指出没有标准化的方法来获取 min 元素的 maxenum 值,但在较新版本的 gcc 中至少有一种可能的方法(>= 9.0),允许这样写:

enum class Fruits { Apples, Oranges, Pears, Bananas };

int main() {
    std::cout << "Min value for Fruits is " << EnumMin<Fruits>::value << std::endl; // 0
    std::cout << "Max value for Fruits is " << EnumMax<Fruits>::value << std::endl; // 3
    std::cout << "Name: " << getName<Fruits, static_cast<Fruits>(0)>().cStr() << std::endl; // Apples
    std::cout << "Name: " << getName<Fruits, static_cast<Fruits>(3)>().cStr() << std::endl; // Bananas
    std::cout << "Name: " << getName<Fruits, static_cast<Fruits>(99)>().cStr() << std::endl; // (Fruits)99
}

无需任何自定义特征或提示即可工作。

这是一个非常粗略的概念证明,我相信它可以进一步扩展,这只是为了表明今天这是可能的。

此代码段在 C++14 中编译并进行了一些调整,它肯定也可以在 C++11 中运行,但我认为这在 C++11 之前是不可能的< /em>

警告:这在未来的编译器版本中可能会中断。

LIVE DEMO

答案 5 :(得分:-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++) {
.... 
}

答案 6 :(得分:-4)

你甚至不需要它们,我所做的只是我说,例如,如果你有:

enum Name{val0,val1,val2};

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

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

   //code
}