Продлевает перечисление? - PullRequest
11 голосов
/ 16 апреля 2011

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

// blah.hpp

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

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

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

Спасибо.

Ответы [ 4 ]

6 голосов
/ 16 апреля 2011

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

4 голосов
/ 16 апреля 2011

Поскольку перечисления обычно обрабатываются как компилятор некоторого размера как 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
};
2 голосов
/ 16 апреля 2011

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

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

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

PizzaDressing a;
a = (PizzaDressing)5;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...