у меня есть два 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;
}
я не уверен, что так вообще можно делать
я не уверен, что так вообще можно делать
Можно. С вашим кодом все нормально.
При преобразовании в enum
неопределенное поведение возникает, если преобразовываемое число не влезает в допустимый диапазон этого enum
a.
У enum class
ов underlying type - всегда int
, если не указан явно (пруф). Поэтому диапазон у двух enum
ов в вопросе одинаковый, и проблем быть не может.
Даже будь это простые enum
(не class
), допустимый диапазон все равно совпадал бы из-за того, что константы в них лежат одинаковые.
Кстати, auto
вот тут:
for (auto i = 0; i < vec_1.size(); i++)
выглядит подозрительно. Он всегда определяется как int
, а более правильно было бы иметь здесь тип std::size_t
.
Как и обещал, код. Но только опять же не понимаю смысл этой задачи
#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;
}
Если перечисления реально одинакового набора, то я бы вовсе не стал заводить разные 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)); });
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Как в multiset удалять элементы на промежутке [first, last] (рамки промежутка вводятся с консоли)? first и last - условные позиции элементов, если бы они имели...
Не так давно услышал о том, что существует способ управлять памятью самому, а не использовать, например, new и deleteМожет кто-нибудь сможет осветить...
QTableWidgetУсловие: Создать квадратную матрицуМатрица должна содержать слова из 4х букв английского алфавита