使用类型超集将std :: variant转换为另一个std :: variant

博马兹

std::variant想将其转换为std::variant具有其类型的超集的另一个有没有一种方法可以使我简单地将一个分配给另一个?

template <typename ToVariant, typename FromVariant>
ToVariant ConvertVariant(const FromVariant& from) {
    ToVariant to = std::visit([](auto&& arg) -> ToVariant {return arg ; }, from);
    return to;
}

int main()
{
    std::variant<int , double> a;
    a = 5;
    std::variant <std::string, double, int> b;
    b = ConvertVariant<decltype(b),decltype(a)>(a);
    return 0;
}

我希望能够简单地编写代码b = a以进行转换,而不是通过这种复杂的转换设置进行操作。不会污染std名称空间。

编辑:简单地编写b = a将产生以下错误:

error C2679: binary '=': no operator found which takes a right-hand operand of type 'std::variant<int,double>' (or there is no acceptable conversion) 

note: while trying to match the argument list '(std::variant<std::string,int,double>, std::variant<int,double>)'
博洛夫

这是Yakk第二种选择的实现:

template <class... Args>
struct variant_cast_proxy
{
    std::variant<Args...> v;

    template <class... ToArgs>
    operator std::variant<ToArgs...>() const
    {
        return std::visit([](auto&& arg) -> std::variant<ToArgs...> { return arg ; },
                          v);
    }
};

template <class... Args>
auto variant_cast(const std::variant<Args...>& v) -> variant_cast_proxy<Args...>
{
    return {v};
}

您可能需要对其进行微调以转发语义。

如您所见,它的用法很简单:

std::variant<int, char> v1 = 24;
std::variant<int, char, bool> v2;

v2 = variant_cast(v1);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将std :: variant的元素复制到另一个variant-type的变量

如何将 VARIANT 变量从一个子程序传递和转换为另一个子程序中的 OBJECT 变量?

创建一个Variant类和std :: map <Variant,Variant>

std::variant,一个包装类,以及“从……到非标量类型的转换……请求”

可以使用 std::variant 的 std::variant

获取一个std :: tuple元素作为std :: variant

将std :: variant转换为模板类实例的std :: tuple

将std :: tuple递归转换为std :: variant

默认从索引构造一个std :: variant

为std :: variant提供一个运算符==

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

如何使用std :: visit将std :: variant的值转换为std :: string

比较std :: variant类型实例

如何迭代std :: variant的类型?

将variant,vector <variant>和vector <vector <variant >>转换为我选择的等效类型

如何流std :: variant <...,...>

std :: variant的参数归纳

从函数返回std :: variant

遍历std :: variant的映射

覆盖 std::variant::operator==

static_assert一个类型在std :: variant的可接受类型之中

在G ++中使用std :: variant

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

返回类型std :: optional <std :: variant <... >>

将一个std :: optional转换为另一个std :: optional

如何将 std::variant 减少到一个值?

如何将“double”转换为“VARIANT”

使用std :: get <index>访问std :: variant

在std :: tuple上使用std :: variant的问题