如何将 variant<Ts...> 的值移动到 variant<T,Ts...> 中?
How do I move the value of a variant<Ts...> into a variant<T,Ts...>?
有没有一种简单的方法可以将某些 std::variant<Ts...>
中包含的数据移动到 std::variant<T,Ts...>
中?
我想可以选择使用额外的 class 模板切换 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);
}
您可以访问然后构造新的变体类型:
return std::visit([](auto&& arg) -> std::variant<T, Ts...> {
return std::forward<decltype(arg)>(arg);
}, std::move(var));
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));
这样做是将源变体中的每个可能类型转换为目标类型。
有没有一种简单的方法可以将某些 std::variant<Ts...>
中包含的数据移动到 std::variant<T,Ts...>
中?
我想可以选择使用额外的 class 模板切换 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);
}
您可以访问然后构造新的变体类型:
return std::visit([](auto&& arg) -> std::variant<T, Ts...> {
return std::forward<decltype(arg)>(arg);
}, std::move(var));
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));
这样做是将源变体中的每个可能类型转换为目标类型。