【问题标题】:get the maximum value of enumeration constants at compile time在编译时获取枚举常量的最大值
【发布时间】:2014-03-19 15:12:13
【问题描述】:

有没有办法获取枚举常量的最大值?

因为枚举常量可能有明确的赋值,它不一定是最后一个元素。大多数情况下有一个常量叫做 XXX_cnt 但在我的情况下它不是。此外,枚举可能会在没有我通知的情况下更改,因此仅使用最后一个元素很容易出错。

那么有什么办法吗?

【问题讨论】:

  • std::numeric_limits<std::underlying_type<yourenum>::type>::max():p
  • @melak47 这并不是我想要的预期输出:)
  • 这只是个玩笑 ;-)
  • 您能否添加更多有关您想要实现的目标的详细信息(甚至是示例),因为我阅读的问题越多,我认为我误解的越多。

标签: c++ enums


【解决方案1】:

没有。这就是为什么有时您可以在枚举类型中找到 ma​​x 和 min 的明确定义:

enum e { zero, one, two, min = zero, max = two};

【讨论】:

    【解决方案2】:

    实现此目的的一种方法是将枚举包装在一个类中:

    class CustomEnum
    {
    public:
        enum CustomEnumValues
        {
            // some values here
        };
    
        static CustomEnumValues Maximum()
        {
            // return the maximum value
        }
        // ...
    };
    

    如果枚举发生变化,类也需要更新。限制更改的一种方法是将MAXIMUM 和MINIMUM 枚举值设置为枚举中的当前最大值和最小值(因此Maximum 函数将始终简单地返回MAXIMUM)。您还可以添加隐式转换运算符,将类直接转换为枚举。

    【讨论】:

    • 是的,但我对该枚举的定义没有影响。如果我将枚举包装在我身边,我必须跟踪该枚举中的任何更改以适应我的代码。
    • 所以“如何获得 enum max”的答案是编写一个返回 enum max 的函数?
    • @vlad_tepesch 这是真的。如果您无法控制枚举,您还可以创建自己的枚举来存储现有枚举的最小值和最大值。每当现有枚举发生更改时,您都必须对您的枚举进行相应的更改。
    • @lizusek 这样做的一种方法,是的。
    • @ZacHowland 我完全同意,但是我想这是 OP 感兴趣的这个函数的主体
    【解决方案3】:

    C++ 不像其他语言那样具有反射功能。所以很遗憾不可能。

    【讨论】:

    • 理论上不需要反射能力来获得这些知识。因为在编译时一切都是已知的。
    【解决方案4】:

    好吧,没有优雅的方法,但您可以使用 Enum classes 并依赖编译器优化。

    这样的类有迭代器,所以你可以在运行时遍历所有枚举并找到最大值,它实际上没有任何成本,因为编译器注意到这些值在运行时不会改变,所以启用优化(不确定哪个级别)编译器使用计算过程中计算的常数。

    【讨论】:

      【解决方案5】:

      使用 constexpr 可以确保枚举迭代器策略将为枚举类提供最大值。 也许模板元编程也允许这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 2012-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多