Я хочу использовать перечисление scoped с std :: get для доступа к объекту, хранящемуся в std :: vector
Из Effective Modern C ++ я использую версию Item 10 для приведения перечислениявведите базовый_тип_т, который можно использовать с 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
объект, который будет добавлен к вектору.
Есть ли способ использовать перечисление как этот?Я чувствую, что упускаю что-то довольно простое.