Как мне переместить значение варианта в варианте ? - PullRequest
1 голос
/ 18 апреля 2020

Есть ли простой способ переместить данные, содержащиеся в некоторых std::variant<Ts...>, в std::variant<T,Ts...>?

Полагаю, в Ts... есть возможность переключать все типы с помощью дополнительного шаблона класса , но мне интересно, есть ли более элегантный способ сделать это на месте.

Пример:

template <typename T, typename... Ts>
std::variant<T,Ts...> use(std::optional<T>&& opt, std::variant<Ts...>&& var) {
  if (opt.has_value()) return *opt;
  else return magic<T,T...>(var);
}

Ответы [ 2 ]

3 голосов
/ 18 апреля 2020

Вы можете посетить, а затем построить новый тип варианта:

return std::visit([](auto&& arg) -> std::variant<T, Ts...> {
    return std::forward<decltype(arg)>(arg);
}, std::move(var));
1 голос
/ 18 апреля 2020
template<class Dest, class Var>
Dest variant_static_cast( Var&& var ){
  return std::visit( [](auto&& elem)->Dest {
    return static_cast<Dest>( decltype(elem)(elem) );
  }, std::forward<Var>(var) );
}

затем

return variant_static_cast<std::variant<T,T...>>(std::move(var));

то, что это делает, приводит каждый возможный тип в исходном варианте к типу назначения.

...