在C++17 中,引入了两个新的类型:std::any 和 std::variant,它们都可以存储和处理各种类型的数据,但是使用方式和适用场景却有所不同。 1.2 对 std::any 和 std::variant 的简单介绍 std::any std::any(任意类型)是一种可以存储任意类型值的容器,只要这个类型是可复制或可移动的。它的设计目标是为了提供一...
std::variant是一个类型安全的union,其模板参数指定了所有支持的类型。我们可以使用std::get来从std::variant中提取出真实的对象,前提是类型是匹配的(否则抛出异常)。std::get_if与std::get功能类似,区别是std::get_if接收指针并且返回指针(类型不匹配返回nullptr)。 不同于std::any在每次使用的时候必须知道类型...
也就是说,std::any,存储对象的方式有两种,对于比较小的对象,会存储在拥有多种类型的union里,该对象位于stack上 ,此时用法与std::variant非常类似,对于比较大的对象,会存在堆上,用void*存储对应堆上的地址,在32位的机器上,这个size的分界值是32个bytes 最后总结一下std::variant与std::any的区别: std::varian...
std::variant是类型安全的union #include<variant>#include<iostream>unionmy_union{inti;floatf;charc;};intmain(){std::cout<<std::boolalpha;std::variant<int,float,char>variant;//这里的variant等价于my_union//在构造的时候,如果构造过程中抛出了异常,valueless_by_exception的返回值为truestd::cout<<var...
因此,std::any的灵活性很高,但是在存储的数据的类型不确定的情况下,它的性能略逊于std::variant。
不允许变体分配额外的(动态)内存。 对于std::any 这是不可能的。 到目前为止, std::variant 只需要为 std::variant 本身分配一个内存,并且它可以保留在堆栈上。 原文由 t.niese 发布,翻译遵循 CC BY-SA 4.0 许可协议 有用 回复 查看全部 2 个回答...
一、Qt中的QVariant Qt中的QVariant QVariant和std::any有些类似,std::variant更像是std::any的一个子集 二、C++标准库中的std::variant(C++17) QVariant和std::variant序列化与反序列化。(序列化就是把程序数据转换为可以传输或者写入文件的数据) ...
为避免union存在的问题,C++17引入一个非常实用且强大的新特性——std::variant。
在赋值后可以使用 std::any_cast 将 std::any 所存储的值转换成特定类型,如果 std::any 中存储的...
在C++17之前,通常使用Union来定义一个可以存储不同类型的变量,现在可以通过std::variant来定义一个可以存储不同类型的新变量。 std::variant优势在于:①存储了变量的类型信息,更安全;②可以存储复杂对象,更好用。 用法如下 3. [[fallthrough]] 显式说明某个switch分支无需break ...