将 std::variant 转换为另一个具有超类型集的 std::variant
Convert std::variant to another std::variant with super-set of types
我有一个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);
选项:
-
编写自己的
variant
类型,可能继承自std::variant
,以您想要的方式实现operator=
和构造。 必须完成一些工作,因为variant
的构造函数可以执行SFINAE技巧,这些技巧可能无法与您的变体类型正常工作;为此,您希望自己执行一些 SFINAE 转发到基本变体,而不是裸using
声明。 -
编写不需要列出源/目标类型的更好的
ConvertVariant
。 您将返回一个转换帮助程序模板类型,该模板类型包含源变体,该变体具有调用非常类似于您的ConvertVariant
的operator std::variant<Ts...>()&&
。
相关文章:
- 在template中使用std::variant的template函数
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- 为 std::variant 提供一个运算符 ==
- 如何使用 std::variant 打印地图键/值?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 在 std::tuple 上使用 std::variant 的问题
- 如何访问存储在 std::variant 中的类的方法
- 更改其类型后,丢失对 std::variant 对象的引用
- std::visit and std::variant usage
- std::variant vs指向C++中异构容器基类的指针
- std::variant<>::get() 不能使用 Apple LLVM 10.0 编译
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 有没有办法避免为 std::variant 类成员中的所有类型编写构造函数?
- 按索引设置 std::variant 的值
- 在 std::variant 中按类型获取索引
- 与传统的多态处理相比,使用 std::variant 有什么优势?
- 无法引用该函数" std:: variant <_Types...> operator =",因为此函数已被删除
- 为什么 std::variant 找不到运算符<() 当与比较类不在同一命名空间中时
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 如何迭代 boost::variant<std::vector<int>, std::vector<String>>?