使用=
不起作用。
我有这样的代码,但是它有点“丑陋”。
#include <iostream>
#include <cassert>
#include <variant>
#include <string>
using namespace std;
namespace detail {
template<typename... L, typename... R>
void VariantAssignRec(variant<L...>* lhs, const variant<R...>&rhs, size_t rhs_idx, std::integral_constant<int, -1>) {
}
template<typename... L, typename... R, int get_idx>
void VariantAssignRec(variant<L...>* lhs, const variant<R...>&rhs, size_t rhs_idx, std::integral_constant<int, get_idx> = {}) {
assert(rhs_idx < std::variant_size_v< variant<R...>>);
if (get_idx == rhs_idx) {
cout << "assigning from idx " << get_idx << endl;
*lhs = std::get<get_idx>(rhs);
return;
}
else {
std::integral_constant<int, get_idx - 1> prev_get_idx;
VariantAssignRec(lhs, rhs, rhs_idx, prev_get_idx);
}
}
}
template<typename... L, typename... R>
void VariantAssign(variant<L...>* lhs, const variant<R...>&rhs) {
detail::VariantAssignRec(lhs, rhs, rhs.index(), std::integral_constant<int, std::variant_size_v<variant<R...>>-1>{});
}
int main()
{
std::variant<int, char, std::string> va = 'a';
std::variant<std::string, int> vb = string("abc");
cout << "va index is " << va.index() << endl;
cout << "vb index is " << vb.index() << endl;
VariantAssign(&va, vb);
cout << "va index now should be 2, and it is " << va.index() << endl;
vb = 47;
VariantAssign(&va, vb);
cout << "va index now should be 0, and it is " << va.index() << endl;
}
我正在使用VS,所以没有,if constexpr
但是我正在寻找通用的C ++ 17解决方案,而不管VC ++是否缺少支持。
只需使用访客:
std::variant<A, B, C> dst = ...;
std::variant<B, C> src = B{};
std::visit([&dst](auto const& src) { dst = src; }, src);
如果其中有一个src
不能分配给的类型,则dst
不会编译-这可能是所需的行为。
如果您最终不经常使用此模式,则可以将分配器移至其自己的函数中:
template <class T>
auto assignTo(T& dst) {
return [&dst](auto const& src) { dst = src; };
}
std::visit(assignTo(dst), src);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句