как вставить перечисления в другой в C ++ - PullRequest
1 голос
/ 16 июня 2011

Я использую перечисление для представления всех сигналов в системе, и есть базовые сигналы, которые представлены в перечислении, но я хочу добавить к нему другие сигналы, вызвав функцию или что-то подобное, могу ли я вставить перечисление веще один?

Ответы [ 3 ]

4 голосов
/ 16 июня 2011

Enum фактически отображает идентификатор в целое число во время компиляции. Вы не можете изменить его во время выполнения. Но для времени выполнения аналогом будет std::map<std::string, int>, в этом случае вы можете добавить новые значения во время выполнения следующим образом:

std::map<std::string, int> values;

// add new values in this way
values.insert( "var1", 100 );
1 голос
/ 16 июня 2011

Исходя из вашего недавнего ответа, я предполагаю, что вы хотите иметь список кодов перечисления и хотите изменить этот список по своему желанию?

Если это так, то просто создайте список / вектор / набор int . Это будет хранить ваши значения независимо от типа перечисления (так как все перечисления инициализируются со скрытым целочисленным значением). Затем вы можете добавлять / удалять элементы из этого списка по желанию.

Пример:

enum SignalsA {
        X,
        Y,
        Z
};

enum SignalsB {
        A,
        B,
        C
};

int main(){

        std::set<int> signal_set;

        signal_set.insert(Z); //Insert enum value from SignalsA
        signal_set.insert(A); //Insert enum value from SignalsB
}
1 голос
/ 16 июня 2011

Вы не можете расширять перечисление как таковое, конечно, не во время выполнения (что в любом случае бессмысленно, потому что enum - это просто список литералов, заменяющих числовые константы).

Если вы на самом деле имеете в виду, что хотите расширитьсписок констант, используемых в вашем коде, затем читайте дальше:

Что вы можете сделать, это создать другое перечисление, которое будет «совместимо» таким образом (или аналогично):

enum {
   E1_ONE,
   E1_TWO,
   E1_LAST,
} base;

enum {
   E1_THREE = E1_LAST,
   E1_FOUR,
   E1_EXT_LAST,
} extension;

И используйте тип enum extension в своем коде, где вы обрабатываете новые значения, но тип enum base в унаследованном коде, который вы расширяете.

enum - это целое число с ограниченными значениями,поэтому вам придется проверять ограничения и т. д.

Если у вас есть доступ к исходному исходному коду (что, я полагаю, вы делаете ...), было бы лучше изменить исходное перечисление, ИМХО.

...