Перечислимый C++ добирается индексом

С почтальоном убедитесь, что у вас установлен один из этих двух Content-Type заголовков:

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

14
задан 26 November 2008 в 19:09
поделиться

6 ответов

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

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

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

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

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

26
ответ дан 1 December 2019 в 06:48
поделиться

Нет, но Вы могли бросить от интервала

Test test = (Test)0;
2
ответ дан 1 December 2019 в 06:48
поделиться

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

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

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

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

Который позволяет Вам сделать вещи как:

for(int i = 0; i < count; i++)
{
    DoSomething((Test)i);
}
10
ответ дан 1 December 2019 в 06:48
поделиться

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

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

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

3
ответ дан 1 December 2019 в 06:48
поделиться

Зависит, под чем Вы подразумеваете, "Я хочу 'привет'".

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

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

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

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

1
ответ дан 1 December 2019 в 06:48
поделиться

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

enum Test{hi = 0, bye};

Затем можно просто обратиться к 'привет' с номером 0, и 'до свидания' с 1.

Хотя это действительно побеждает целую цель использовать перечисление во-первых.

0
ответ дан 1 December 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: