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

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

// blah.hpp

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

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

Так как же я могу добавить перец без явного изменения исходного перечисления?

Благодарю.

Ответ 1

Поскольку перечисления, как правило, обрабатываются как некоторый размер 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, вы можете сделать что-то вроде этого:

#include <string>
#include <map>

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

Ответ 4

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

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

PizzaDressing a;
a = (PizzaDressing)5;