在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的用法与std::variant的用法很像,std::variant需要在创建该对象时在<>里指定可以接受的参数类型,而std::any不需要指定参数类型(因为它可以接受任何类型),鉴于二者各自的特点,std::any显然更方便,但是std::any在type safe上不如std::variant,比如下面这段代码: std::any data; data ="Hel...
cppreference.com - std::variant 与联合一样,如果一个变体包含某个对象类型的值 T ,则 --- T 对象表示直接在变体本身的对象表示中分配。不允许变体分配额外的(动态)内存。 对于std::any 这是不可能的。 到目前为止, std::variant 只需要为 std::variant 本身分配一个内存,并且它可以保留在堆栈上。 原文...
莫名的觉得这三个类好像,所以就放在一块学习一下,感觉就是一个代表很多类型的类。 std::any一个类型安全的容器,可以放置各种类型的数据。 std::variantstd:...
本文将详细介绍QVariant、std::variant、std::any、std::optional、std::visit和union这几种C++中的数据结构,通过对比分析它们的优缺点,帮助读者在实际开发中做出更好的选择。
一、Qt中的QVariant Qt中的QVariant QVariant和stdany有些类似,stdvariant更像是std::any的一个子集 二、C标准库中的std::variant(C17) QVariant和std::variant序列化与反序列化。(序列化就是把程序数据转换为可以传输或
std::vector<std::any> values{1.0, "Hello", -42, 'b'}; for(auto & any : values) { int * i; if(i = std::any_cast<int>(&any)) std::cout << "int: " <…
为避免union存在的问题,C++17引入一个非常实用且强大的新特性——std::variant。
std::any 是 c++17 标准新提供的类,作用是存储任意类型的一段内存,并可以重复赋值,在赋值后可以...