Расширение перечисления?

скажем, я создаю перечисление, но в конце концов кто-то хочет добавить к этому перечислению, что делать? ex:

blah.hpp
enum PizzaDressing {
DRESSING_OLIVES = 0,
DRESSING_CHEESE = 1
};

и в моем классе FunkyPizza могут быть перцовые начинки.

Итак, как я мог добавить перцы без очевидного изменения исходного перечисления?

спасибо

4 ответов


поскольку перечисления обычно обрабатываются как некоторый размер int в компиляторе, все, что вам нужно сделать, это позже сделать

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

или вы могли бы позволить ему считать

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

вы можете, если ни один из них не приемлем по какой-либо причине, использовать math (Cheese + 1). Вы можете играть с перечислением практически любым способом с числовым значением.

обратите внимание, что используемый перечислитель обычно запекается компилятором в код, он не отображается как его имя, просто ценность. Таким образом, изменение (расширение) перечислителя позже не повлияет на созданный код.

Я думаю, что это юридический синтаксис для использования перечисления в другом перечислителе с приведениями, но я никогда не пробовал. Это может сработать, но это уродливо:

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

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

Это ближе всего к тому, что вы хотите:наследование базового класса перечисления


Это было бы известно как"динамическое перечисление". Насколько мне известно, ничего подобного в 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;

вы не можете динамически изменять перечисление, потому что оно определяет только новый тип, разрешенный во время компиляции. Они являются мнемоникой для программиста, при компиляции они переводятся в числа.

тем не менее, вы можете использовать любое число, не используемое исходным перечислением, чтобы представить все, что вы хотите:

PizzaDressing a;
a = (PizzaDressing)5;