Добавление числа к перечислению, чтобы получить другое перечисление - PullRequest
1 голос
/ 08 мая 2020

Я хочу получить значение перечисления в a для l oop, добавив число, например

enum example
{
Example_1,
Example_2,
Example_3,
.
.
.
Example_n
};
example x;
for (i = 0; i < n; i++
{x = Example_ + i; // if i = 5, I need Example_5
}

Я хочу эту реализацию на C ++ 11

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Если у вас есть Example_0 в перечислении, то Example_0 + 5 даст вам целочисленное значение, эквивалентное Example_5. Перечисления - это просто целые числа.

Все это при условии, что вы явно не присваиваете значение определенной константе перечисления - это уже другая история.

0 голосов
/ 08 мая 2020

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

  • С непрерывным перечислением вы можете использовать простую арифметику c.

  • вы можете создать operator++ для своего перечисления, разрешить переключателем:

    example operator++(example e)
    {
        switch (e) {
        case Example_1: return Example_2;
        case Example_2: return Example_3;
        case Example_3: return Example_4;
        // ...
        case Example_n: return Last;
        };
        throw std::runtime("value out of range");
    }
    

    и, возможно,

    for (example e = Example_1: e != Last; ++e) {/*..*/}

  • с использованием массива для предоставления списка перечислений:

    constexpr auto AllExamples() {
        constexpr std::array res{{Example_1,
                                  Example_2,
                                  /*..*/,
                                  Example_n}};
        return res;
    }
    

    , что позволяет:

    for (auto ex : AllExamples()) {/*..*/}
    f(AllExamples()[5]);
    
  • или использовать карту, если вам действительно нужно играть с именами:

    std::map<std::string, example> ExamplesAsMap() {
        return {
            {"Example_1", Example_1},
            {"Example_2", Example_2},
            /*..*/
            {"Example_n", Example_n},
            {"Value_1", Value_1},
            {"Value_2", Value_2},
            /*..*/
            {"Value_n", Value_n}
            /**/
        };
    }
    

    А потом

    const auto m = ExamplesAsMap();
    example x;
    for (int i = 0; i < n; i++) {
        x = m.at("Example_" + std::to_string(i));
        // ...
    }
    
...