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

Max and min values in a C++ enum

本文关键字:最小值 最大值 枚举 C++      更新时间:2023-10-16

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

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

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

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

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

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

num_values将包含枚举中的值数。

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

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

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

请参阅此网页,了解其实用性的一些示例: 愚蠢的枚举技巧

  enum My_enum
    {
       FIRST_VALUE = 0,
       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,
       LAST_VALUE
    };

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

尽管公认的答案正确地指出没有标准化的方法来获取enum元素的minmax值,但在较新版本的 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 之前

是不可能的

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

现场演示

如果确定所有枚举值都按升序排列(或者至少最后一个保证具有最大值),则可以使用魔术枚举库,而无需向枚举定义添加额外的元素。它是这样用的:

#include <magic_enum.hpp>
...
    
const size_t maxValue = static_cast<size_t>(magic_enum::enum_value<MyEnum>(magic_enum::enum_count<MyEnum>() - 1));

魔法枚举 git:https://github.com/Neargye/magic_enum

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

enum Name{val0,val1,val2};

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

if(selectedOption>=val0 && selectedOption<=val2){
   //code
}