在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...
float,char>variant;//这里的variant等价于my_union//在构造的时候,如果构造过程中抛出了异常,valueless_by_exception的返回值为truestd::cout<<variant.valueless_by_exception()<<std::endl;//false{variant=12;// variant包含了int类型inti=std::get<int>(variant)...
因此,std::any的灵活性很高,但是在存储的数据的类型不确定的情况下,它的性能略逊于std::variant。
此外std::variant 限制条目类型,除此之外。为什么我们应该更喜欢 std::variant 而不是 std::any 更易于使用?
一、Qt中的QVariant Qt中的QVariant QVariant和stdany有些类似,stdvariant更像是std::any的一个子集 二、C标准库中的std::variant(C17) QVariant和std::variant序列化与反序列化。(序列化就是把程序数据转换为可以传输或
为避免union存在的问题,C++17引入一个非常实用且强大的新特性——std::variant。
2. std::variant 升级版的C语言Union 在C++17之前,通常使用Union来定义一个可以存储不同类型的变量,现在可以通过std::variant来定义一个可以存储不同类型的新变量。 std::variant优势在于:①存储了变量的类型信息,更安全;②可以存储复杂对象,更好用。
在赋值后可以使用 std::any_cast 将 std::any 所存储的值转换成特定类型,如果 std::any 中存储的...