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 ответ
Есть несколько проблем с этим кодом.
Вы пытаетесь использовать индекс времени выполнения в std::get, который требует индекса времени компиляции
Вы пытаетесь выбрать в std:: варианте, в то время как вариант не содержит несколько типов одновременно (кортеж делает). Также обратите внимание, что вариант уже знает, какой тип он содержит в данный момент
В качестве дополнительной проблемы: кортеж IMAO следует использовать редко, поскольку он довольно уродлив с точки зрения читабельности, структура с именованными членами обычно намного приятнее.