Enum и std::get

Я хочу использовать перечисление scoped с std::get для доступа к объекту, хранящемуся в std::vector

Из Effective Modern C++ я использую версию Item 10 для приведения типа enum к базовому_типу_типа, который можно использовать с std::get

template<typename E>
constexpr auto to_mytype(E enumerator) noexcept
{
    return static_cast<std::underlying_type_t<E>>(enumerator);
}

а также

enum class my_type{sel_1, sel_2};

я имею

std::vector<std::variant<std::unique_ptr<option1>, std::unique_ptr<option2>> my_store;

который является членом my_class, и я хочу использовать объект, хранящийся в этом векторе, так

void my_class::my_function(const my_type selection)
{
    std::get<to_mytype(selection)>(my_store[i])->do_work();
}

где выбор будет sel_1 или же sel_2, Если я попробую это, я получу

error: selection is not a constant expression

На самом деле я хотел бы сохранить тип, выбранный в классе, и дать пользователю только один раз передать его конструктору my_class, чтобы выбрать, option1 или же option2 объект, который будет добавлен к вектору.

Есть ли способ, которым я могу использовать перечисление, как это? Я чувствую, что упускаю что-то довольно простое.

1 ответ

Есть несколько проблем с этим кодом.

  1. Вы пытаетесь использовать индекс времени выполнения в std::get, который требует индекса времени компиляции

  2. Вы пытаетесь выбрать в std:: варианте, в то время как вариант не содержит несколько типов одновременно (кортеж делает). Также обратите внимание, что вариант уже знает, какой тип он содержит в данный момент

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

Другие вопросы по тегам