gpt4 book ai didi

c++ - 从变量 分配变量

转载 作者:太空狗 更新时间:2023-10-29 20:21:18 25 4
gpt4 key购买 nike

使用 = 无效。

我有这样的代码,但它“有点”难看。

#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);

关于c++ - 从变量 <C,B> 分配变量 <A,B,C>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44816579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com