Enum C ++ Получить по индексу - PullRequest
13 голосов
/ 26 ноября 2008

Мне было интересно в C ++, есть ли у меня enum, могу ли я получить доступ к значению второго индекса? Например, у меня есть

enum Test{hi, bye};

если я хочу 'привет', могу ли я сделать что-то вроде Test [0], спасибо.

Ответы [ 7 ]

26 голосов
/ 26 ноября 2008

Да и нет. Если ваш Enum не имеет явных значений, это возможно. Без явных значений перечисляемым значениям присваиваются числовые значения 0-N в порядке объявления. Например ...

enum Test {
  hi, // 0
  bye // 1
}

Это означает, что индексы просто переводятся в буквальное значение.

Test EnumOfIndex(int i) { return static_cast<Test>(i); }

Это, конечно, делает проверку 0 во время выполнения, и как только вы добавите явное значение, оно сломается. Но это будет работать в сценарии по умолчанию.

10 голосов
/ 26 ноября 2008

Если не указано иное, перечисления начинаются с нуля и увеличиваются на 1 для каждой записи.

enum Test
{
    hi, //0
    bye, //1
    count //2
}

Вы можете привести int к типу перечисления, чтобы получить желаемое значение, например:

(Test)0;
//or
Test(0);

Что позволяет вам делать такие вещи, как:

for(int i = 0; i < count; i++)
{
    DoSomething((Test)i);
}
1 голос
/ 26 ноября 2008

Зависит от того, что вы подразумеваете под «я хочу« привет »».

Если вы хотите сказать, что хотите получить значение, вы можете получить его, применив int, как говорили другие.

Приведение числового литерала к типу enum обычно бессмысленно - если вы знаете, какое значение вы ожидаете, вы можете использовать имя. Таким образом, перечисление может измениться, не нарушая ваш код. Я предполагаю, что возможно что-то действительно странное происходит, когда кто-то создал перечисление и задокументировал, что означает «3», но не то, какое значение перечисления это. Но тогда вы захотите исправить API.

Преобразование целочисленного значения, известного во время выполнения, в enum может быть полезным, если вы сериализовали данные. Пока вы знаете, что он находится в диапазоне перечисления, результат определен.

Если вы имеете в виду, что хотите строку «привет», то ее не может быть. В отличие от Java, в C ++ имена значений в перечисляемых типах существуют только во время компиляции, а не во время выполнения и отображаются только в одном направлении.

1 голос
/ 26 ноября 2008

Перечисления отображают имена в значения. В вашем случае (int) hi будет иметь значение 0, а (int) пока значение 1. Вы можете использовать приведение, чтобы получить значение hi:

int myInteger = 0;
Test myValue = (Test)myInteger;

Обратите внимание, что myValue может быть недопустимым значением enum, если myInteger находится вне диапазона.

0 голосов
/ 02 февраля 2017

Если вы исключаете значение, возвращаемое как {Привет или пока}, то вы не можете получить такое значение.

я бы не советовал делать это для того, чтобы получить фактическое значение, но его можно использовать как хак

string return_value(int index)
{
string temp = "";
switch (index)
{
case 1: temp = "hi"
break;
case 2: temp = "bye";
break;
defualt :
break;
}
return temp;
}

приведение типа к enum снова вернет индекс, но вы можете назначить его другой переменной enum

0 голосов
/ 26 ноября 2008

Ваш лучший вариант может быть что-то вроде этого:

enum Test{hi = 0, bye};

Тогда вы можете просто сослаться на «привет» с цифрой 0 и «пока» с 1.

Хотя в действительности это сводит на нет всю цель использования перечисления.

0 голосов
/ 26 ноября 2008

Нет, но вы можете разыграть из int

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