【问题标题】:Max and min values in a C++ enumC++ 枚举中的最大值和最小值
【发布时间】:2010-09-14 14:42:18
【问题描述】:

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

【问题讨论】:

  • 我可能想知道枚举的最大值而不将其添加到枚举本身的一个原因是,当我的“switch”语句未明确处理时,我的编译器不会抱怨(C4061) “最大值”值。

标签: c++ enums


【解决方案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
}

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

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

这个 sn-p 在 C++14 中编译,经过一些调整,它肯定也可以在 C++11 中运行,但我认为这在 C++ 之前的版本中是不可能的11

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

LIVE DEMO

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 对非顺序枚举仍然有用——只要你不期望每个值都存在
    • @Adrian:是的,这是真的。您不需要每个值都具有定义的名称才能使此技术有用。我会相应地编辑
    • 好的,但是如果添加新的,你必须保持它的价值。
    【解决方案3】:

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

    enum Name{val0,val1,val2};
    

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

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

    【讨论】:

    • 这是一个非常脆弱的解决方案。如果添加新的枚举值,则必须调查整个代码库以更新此类测试。
    【解决方案4】:
      enum My_enum
        {
           FIRST_VALUE = 0,
    
           MY_VALUE1,
           MY_VALUE2,
           ...
           MY_VALUEN,
    
           LAST_VALUE
        };
    

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

    【讨论】:

      【解决方案5】:

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

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

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

      请参阅此网页以了解这如何有用的一些示例:Stupid Enum Tricks

      【讨论】:

      • 您链接的文章来自作者编译器“不支持新的官方 C++ 布尔类型”的时代......我以前从未读过这么古老的东西:P。
      【解决方案6】:

      不,不在标准 C++ 中。您可以手动完成:

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

      num_values 将包含枚举中值的数量。

      【讨论】:

      • num_values 将包含数字 1 的值
      • @lizusek: num_values 将包含枚举中值的数量,num_values 本身除外。
      • @dalie 是的,这就是为什么它会是:值的数量 - 1。当然我知道你的意思是一个值,它表示不包括最后一个值的值,这不是一个真正的值,而是一个帮助器.但是我建议让它更清晰。
      • @dalle 仅当 val0 = 0
      • 我更喜欢这种方法而不是其他方法,因为添加新方法时无需更新它的值,只要它是列表中的最后一个
      猜你喜欢
      • 1970-01-01
      • 2011-03-27
      • 2010-12-17
      • 2010-09-17
      • 2019-07-21
      • 1970-01-01
      • 2014-03-22
      • 2016-05-26
      相关资源
      最近更新 更多