在C++17 中,引入了两个新的类型:std::any 和 std::variant,它们都可以存储和处理各种类型的数据,但是使用方式和适用场景却有所不同。 1.2 对 std::any 和 std::variant 的简单介绍 std::any std::any(任意类型)是一种可以存储任意类型值的容器,只要这个类型是可复制或可移动的。它的设计目标是为了提供一...
不同于std::any在每次使用的时候必须知道类型,我们可以使用std::visit来对std::variant进行一个模板操作。std::visit接收一个函数对象(一般都是lambda),后面参数为std::variant,这些std::variant的真实值会作为参数传递给前面的函数对象。我们只需要把函数对象声明成模板,就可以对std::variant支持的所有类型进行通用...
然而,由于QVariant依赖于Qt框架,因此无法在非Qt项目中直接使用。此外,由于QVariant内部实现的原因,某些类型可能无法正确存储或转换。 std::variantstd::variant是C++17引入的一种新类型,用于存储不同类型的值。相比QVariant,std::variant更加标准且轻量级,不需要依赖外部框架。它提供了更丰富的操作符重载和类型检查功能...
因此,std::any的灵活性很高,但是在存储的数据的类型不确定的情况下,它的性能略逊于std::variant。
总的来说,std::optional可以表示特定类型的失败的情况,函数返回类型为std::optional<T>,当正常返回T时,代表返回正常结果,当返回{}时,代表返回错误结果。 std::optional<T>顾名思义,可选的,它可以返回T对象,也可以不返回T对象。 std::variant 在C++11里,如果想要一个函数返回多个变量,可以让其返回std::pair...
一、Qt中的QVariant Qt中的QVariant QVariant和std::any有些类似,std::variant更像是std::any的一个子集 二、C++标准库中的std::variant(C++17) QVariant和std::variant序列化与反序列化。(序列化就是把程序数据转换为可以传输或者写入文件的数据) ...
std::variant 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的返回值为truest...
不允许变体分配额外的(动态)内存。 对于std::any 这是不可能的。 到目前为止, std::variant 只需要为 std::variant 本身分配一个内存,并且它可以保留在堆栈上。 原文由 t.niese 发布,翻译遵循 CC BY-SA 4.0 许可协议 有用 回复 查看全部 2 个回答...
不支持构造函数和析构函数等缺点。为避免union存在的问题,C++17引入一个非常实用且强大的新特性——std...
std::any 是 c++17 标准新提供的类,作用是存储任意类型的一段内存,并可以重复赋值,在赋值后可以...