【问题标题】:Extending an enum?扩展枚举?
【发布时间】:2011-04-16 02:00:18
【问题描述】:

假设我创建了一个枚举,但最终有人想将项目添加到该枚举中,该怎么办? 例如:

// blah.hpp

enum PizzaDressing {
    DRESSING_OLIVES = 0,
    DRESSING_CHEESE = 1
};

在我的 FunkyPizza 课上,可能会有胡椒配料。

那么如何在不明显修改原始枚举的情况下添加辣椒呢?

谢谢。

【问题讨论】:

标签: c++ enums


【解决方案1】:

这是最接近你想要的:Base enum class inheritance

【讨论】:

  • 对不起线程死灵,但我必须强调,这是一种比公认答案描述的更好的方法。它允许以一种无法将扩展值传递给无法处理它们的旧函数的方式扩展枚举。
  • @antipattern:SO 上没有线程死灵法,因为没有线程,只有问题、答案和 cmets ;)。
【解决方案2】:

由于枚举通常在编译器中被处理为某种大小的 int,所以您所要做的就是稍后生成

enum PizzaDressing
{
    Olives = 0,
    Cheese = 1,
    Pepperoni = 2
};

或者你可以让它计数

enum PizzaDressing
{
    Olives = 0,
    Cheese = 1,
    Pepperoni
};

如果由于某种原因这些都不可接受,您可以使用数学 (Cheese + 1)。 您几乎可以用任何可以使用数值的方式来使用枚举。

请注意,您使用的枚举器通常由编译器添加到代码中,它不会显示为它的名称,而只是值。因此,稍后修改(扩展)枚举器不会影响已构建的代码。

我认为在另一个枚举器中使用枚举是合法的语法,但我从未尝试过。这可能有效,但有点难看:

enum PizzaDressing
{
    Olives = 0,
    Cheese = 1
};

enum OtherPizzaDressings
{
    Start = (OtherPizzaDressings)PizzaDressing::Cheese;
    Pepperoni
};

【讨论】:

    【解决方案3】:

    这将被称为“动态枚举”。据我所知,C++ 中不存在这样的东西。但是,由于我们使用的是 C++ 而不是 C,因此您可以执行以下操作:

    #include <string>
    #include <map>
    
    std::map<std::string, int> myMap;
    myMap["DRESSING_OLIVES"] = 0;
    myMap["DRESSING_CHEESE"] = 1;
    myMap["PEPPER_TOPPING"] = 2;
    

    【讨论】:

    • 必须注意的是,使用地图的开销要比使用普通的enum 大得多。 map 是在执行期间动态构建和维护的数据结构:对 map 元素的每次访问都是一个函数调用。 enum 是一种新的编译时类型,与int 一样复杂。
    • 是的,与普通枚举相比,这个字符串映射会非常慢。 C# 中没有“动态枚举”(我应该知道;我为该问题编写了解决方法:codeproject.com/KB/cs/symbol.aspx
    • 我的错,我用谷歌搜索了“动态枚举”并且出现了一堆 C# 结果,所以我假设。我做了更多的研究,我猜所有这些结果都是人们问同样的问题。编辑。谢谢
    • 自 C++11 以来不是 std::map constexpr 吗?如果是这样,将其用作动态枚举实现是否可以?
    【解决方案4】:

    您不能动态修改枚举,因为它只定义了在编译时解析的新类型。它们是程序员的助记符,在编译时它们被转换为数字。

    也就是说,您可以使用原始枚举未使用的任何数字来表示您想要的任何内容:

    PizzaDressing a;
    a = (PizzaDressing)5;
    

    【讨论】:

    • 但是你可以简单地在任何地方使用数字。那么有什么意义呢?最好使用编译器/语言功能来跟踪它,而不是用讨厌的手来做。
    • 我不知道。我不知道你想做什么。我只是在解释编译器功能,以便人们可以决定如何继续和使用它。也许有人有一个map&lt;string, int&gt;,其中一些名称的值动态定义在 100 以上,而在 100 以下有一个静态定义的enum。无论如何,这只是程序员可以根据自己的喜好编造和使用语言的无数可能性中的一种情况。
    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多