从variant <C,B>分配variant <A,B,C>?

无意义

使用=不起作用。

我有这样的代码,但是它有点“丑陋”。

#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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++对VARIANT_BOOL的缩写*

C ++中的std :: variant cout

类内部的C ++ 17 variant <any>

C ++ std :: variant vs std :: any

使用std :: variant的Swift Objective-C ++

在C ++中,CMailItem :: Display(VARIANT&Modal)它要查找的VARIANT变量是什么?

从C ++中的VARIANT到C#编组safearray的safearray

C ++运算符[]通过模板访问boost :: variant的重载

C ++获取当前类型为std :: typeindex的std :: variant

C ++根据给定的类型名称从Variant返回数据

使用boost :: variant C ++隐式运算符重载

如何将variant的元素转换为std :: string(c ++)

破坏_variant_t会导致断点(C ++)

GNU C++ stdlib std::variant 实现的变化

std :: variant反射。我如何知道std :: variant分配了哪种类型的值?

如何从 ('a', 'b', 'c') 得到 ('a', 'a/b', 'a/b/c')?

C ++ std :: variant-类型特征以验证所包含的变量类型是否满足某些假设

定义一个函数以返回指定类型的std :: variant C ++

为什么C ++运算符new / delete / variant不应该放在头文件中?

使用C ++ 20 <=>将std :: variant与int比较不是常量表达式

如何将 Boost Variant 与 struct 对象一起使用 C++

如何从C#中的方法返回VB6 Variant类型的等效项

如何使用C ++中COM对象返回的VARIANT数据类型访问SAFE ARRAY?

(C ++,boost :: variant)boost变量映射的数据类型,并对其执行数学运算

c++17 std::variant 如何確定使用哪種類型?

C++ 編譯器錯誤:使用已刪除的函數 std::variant()

使用 pybind11 在 C++ 中将 Python 类表示为 std::variant 中的类型

在 C++ 中包含 `std::variant` 的映射中填充映射的最简单方法是什么?

分配左侧的函数调用必须返回Variant或Object