C++ 扩展枚举?

C++ 扩展枚举?,c++,enums,C++,Enums,假设我创建了一个枚举,但最终有人想向该枚举添加项,那么该怎么做呢? 例: 在我的时髦比萨饼课上,可能会有胡椒粉配料 那么,我如何在不明显修改原始枚举的情况下添加辣椒呢 谢谢。这将被称为“动态枚举”。据我所知,C++中没有类似的东西。但是,由于我们使用C++而不是C,你可以做这样的事情:< /P> #include <string> #include <map> std::map<std::string, int> myMap; myMap["DRESSING

假设我创建了一个枚举,但最终有人想向该枚举添加项,那么该怎么做呢? 例:

在我的时髦比萨饼课上,可能会有胡椒粉配料

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

谢谢。

这将被称为“动态枚举”。据我所知,C++中没有类似的东西。但是,由于我们使用C++而不是C,你可以做这样的事情:< /P>
#include <string>
#include <map>

std::map<std::string, int> myMap;
myMap["DRESSING_OLIVES"] = 0;
myMap["DRESSING_CHEESE"] = 1;
myMap["PEPPER_TOPPING"] = 2;
#包括
#包括
std::map myMap;
myMap[“调味橄榄”]=0;
myMap[“调味奶酪”]=1;
myMap[“辣椒酱”]=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
};

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

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

PizzaDressing a;
a = (PizzaDressing)5;

这与您想要的最接近:

必须注意,使用映射的开销比使用普通的
枚举的开销要大得多
map
是在执行期间动态构建和维护的数据结构:对
map
元素的每次访问都是一个函数调用
enum
是一种新的编译时类型,它与
int
一样复杂。是的,与普通enum相比,此字符串映射速度非常慢。C#中没有“动态枚举”(我应该知道;我为这个问题编写了解决方法:)我的错,我在谷歌上搜索了“动态枚举”,然后出现了一堆C#结果,所以我假设。我做了更多的研究,我想所有这些结果都是人们问了同样的问题。编辑。谢谢自从C++11以来没有
std::map
constepr
?如果是这样的话,将其用作动态枚举实现会更好吗?但是,您可以在任何地方简单地使用数字。那有什么意义呢?最好使用编译器/语言功能来跟踪它,而不是用下流的casty hand来做。我不知道。我不知道你想做什么。我只是解释一下编译器的特性,这样人们就可以决定如何继续使用它了。可能有一个
map
,其中一些名称的值在100以上动态定义,而在100以下有一个静态定义的
enum
。不管怎样,这只是程序员为了自己的利益而编写和使用该语言的无数种可能性中的一种情况。抱歉的线程死灵术可能重复,但我必须强调,这是一种比公认的答案描述的更好的方法。它允许扩展枚举,使扩展值无法传递给无法处理它们的旧函数。@反模式:没有线程死灵术,因为没有线程,只有问题、答案和注释;)。
PizzaDressing a;
a = (PizzaDressing)5;