Enum и std :: get - PullRequest
       8

Enum и std :: get

0 голосов
/ 20 сентября 2018

Я хочу использовать перечисление 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 объект, который будет добавлен к вектору.

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

1 Ответ

0 голосов
/ 21 сентября 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...