C++ 如何移动变量的值<;Ts.>;变成变体<;T、 Ts…>;?

C++ 如何移动变量的值<;Ts.>;变成变体<;T、 Ts…>;?,c++,variadic-templates,variant,C++,Variadic Templates,Variant,是否有一种简单的方法将某些std::variant中包含的数据移动到std::variant中 我想有一个选项可以使用额外的类模板切换Ts中的所有类型。,但我想知道是否有一种更优雅的方法可以做到这一点 例如: template <typename T, typename... Ts> std::variant<T,Ts...> use(std::optional<T>&& opt, std::variant<Ts...>&&

是否有一种简单的方法将某些
std::variant
中包含的数据移动到
std::variant

我想有一个选项可以使用额外的类模板切换
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);
}
模板
std::variant用法(std::optional&&opt,std::variant&&var){
if(opt.has_value())返回*opt;
else返回魔法(var);
}

您可以访问并构建新的变体类型:

return std::visit([](自动和参数)->std::variant{
返回标准::转发(arg);
},std::move(var));

您可以访问并构建新的变体类型:

return std::visit([](自动和参数)->std::variant{
返回标准::转发(arg);
},std::move(var));
模板
目标变量\u静态\u转换(变量和变量){
返回标准::访问([](自动和元素)->目的地{
返回静态_cast(decltype(elem)(elem));
},std::forward(var));
}
然后

returnvariant\u static\u cast(std::move(var));
这会将源变量中的每个可能类型强制转换为目标类型。

模板
目标变量\u静态\u转换(变量和变量){
返回标准::访问([](自动和元素)->目的地{
返回静态_cast(decltype(elem)(elem));
},std::forward(var));
}
然后

returnvariant\u static\u cast(std::move(var));

这样做的目的是将源变量中的每个可能类型强制转换为目标类型。

我没有使用C++17,但我非常怀疑这是否可能。您可以看到,
operation=
高度依赖于变量的类型。因此,您无法避免对所有类型进行迭代(假设,如果类型是可复制的,那么memcopying可以使其更短,但它不是一个通用的解决方案)。当然,您可以使用访问者模式使其看起来美观、通用,但除此之外没有其他功能。@ALX23z是的,我想让您注意答案。我碰巧没有使用C++17,但我非常怀疑这是否可能。您可以看到,
operation=
高度依赖于变量的类型。因此,您无法避免对所有类型进行迭代(假设,如果类型是可复制的,那么memcopying可以使其更短,但它不是一个通用的解决方案)。当然,你可以用访问者模式使它看起来漂亮和通用,但除此之外没有其他。@ALX23z是的,我想让你注意答案。
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));