扩展枚举?

jma*_*erx 13 c++ enums

假设我创建了一个枚举,但最终有人想要添加到枚举,那么一个人做什么?例如:

// blah.hpp

enum PizzaDressing {
    DRESSING_OLIVES = 0,
    DRESSING_CHEESE = 1
};
Run Code Online (Sandbox Code Playgroud)

在我的FunkyPizza课上,可能会有辣椒浇头.

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

谢谢

rub*_*nvb 7

这最接近你想要的:基本枚举类继承


And*_*sen 5

这被称为“动态枚举”。据我所知,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;
Run Code Online (Sandbox Code Playgroud)

  • 必须注意的是,使用映射的开销比使用普通的“枚举”要大得多。“map”是在执行期间动态构建和维护的数据结构:对“map”元素的每次访问都是一个函数调用。“enum”是一种新的编译时类型,与“int”一样复杂。 (7认同)

ssu*_*ube 5

由于枚举通常在编译器中以int的某种大小处理,因此您要做的只是稍后进行

enum PizzaDressing
{
    Olives = 0,
    Cheese = 1,
    Pepperoni = 2
};
Run Code Online (Sandbox Code Playgroud)

或者你可以让它计数

enum PizzaDressing
{
    Olives = 0,
    Cheese = 1,
    Pepperoni
};
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因两者都不可接受,则可以使用math(Cheese + 1)。几乎可以使用数值来以任何方式使用枚举。

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

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

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

enum OtherPizzaDressings
{
    Start = (OtherPizzaDressings)PizzaDressing::Cheese;
    Pepperoni
};
Run Code Online (Sandbox Code Playgroud)