Расширение перечисления?
скажем, я создаю перечисление, но в конце концов кто-то хочет добавить к этому перечислению, что делать? 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;