работа с enum class

148
08 июля 2019, 08:10

у меня есть два enum class

enum class enum_1{ A,B,C };
enum class enum_2{ A,B,C };

есть два вектора

vector<enum_1> vec_1;
vector<enum_2> vec_2;

как мне переложить в vec_2, в котором лежат элементы enum_2, элементы enum_1, которые лежат в vec_1? я пробовал как-то так:

vector<enum_2> Function() const {
    std::vector<enum_1> vec_1{ 
             enum_1::A,
             enum_1::B,
             enum_1::C
    };
    vector<enum_2> vec_2;
    for (auto i = 0; i < vec_1.size(); i++)
    {
            enum_2 tmp= static_cast<enum_2>(vec_1[i]);
            vec_2.push_back(tmp);
    }
    return result;
}

я не уверен, что так вообще можно делать

Answer 1

я не уверен, что так вообще можно делать

Можно. С вашим кодом все нормально.

При преобразовании в enum неопределенное поведение возникает, если преобразовываемое число не влезает в допустимый диапазон этого enuma.

У enum classов underlying type - всегда int, если не указан явно (пруф). Поэтому диапазон у двух enumов в вопросе одинаковый, и проблем быть не может.

Даже будь это простые enum (не class), допустимый диапазон все равно совпадал бы из-за того, что константы в них лежат одинаковые.

Кстати, auto вот тут:

for (auto i = 0; i < vec_1.size(); i++)

выглядит подозрительно. Он всегда определяется как int, а более правильно было бы иметь здесь тип std::size_t.

Answer 2

Как и обещал, код. Но только опять же не понимаю смысл этой задачи

#include <vector>
enum class FirstEnum
{
    A,
    B,
    C
};
enum class SecondEnum
{
    A,
    B,
    C
};
std::vector<SecondEnum> func()
{
    std::vector<FirstEnum> vec_1{FirstEnum::A, FirstEnum::B, FirstEnum::C};
    std::vector<SecondEnum> result;
    for (auto i{ 0 }; i < vec_1.size(); i++)
    {
        result.push_back(static_cast<SecondEnum>(vec_1[i]));
    }
    return result;
}
int main()
{
    auto result = func();

    return 0;
}
Answer 3

Если перечисления реально одинакового набора, то я бы вовсе не стал заводить разные enum (тем более делать их enum class) для этих целей. Но коли уж типы различны, то задача преобразования вектора объектов одного типа в другой - это вполне себе отдельная задача и для её решения есть стандартная функция std::transform. Применительно к типам перечислений это могло бы выглядеть примерно так:

#include <algorithm>
#include <vector>
#include <iterator>
enum class E1 { A, B, C };
enum class E2 { A, B, C };
int main() {
    std::vector<E1> v1 { E1::A, E1::B, E1::C };
    std::vector<E2> v2;
    std::transform(v1.begin(), v1.end(), std::back_inserter(v2), 
                   [](auto e1) { return static_cast<E2>(static_cast<int>(e1)); });
}
READ ALSO
Удаление на промежутке в multiset

Удаление на промежутке в multiset

Как в multiset удалять элементы на промежутке [first, last] (рамки промежутка вводятся с консоли)? first и last - условные позиции элементов, если бы они имели...

161
Аллокаторы памяти

Аллокаторы памяти

Не так давно услышал о том, что существует способ управлять памятью самому, а не использовать, например, new и deleteМожет кто-нибудь сможет осветить...

138
Получение элемента из QTableWidget

Получение элемента из QTableWidget

QTableWidgetУсловие: Создать квадратную матрицуМатрица должна содержать слова из 4х букв английского алфавита

158