首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std::variant上的std::as不能像我预期的那样工作

std::variant是C++17中引入的一种数据类型,它可以存储多个不同类型的值,类似于联合体。而std::variant::as是一个成员函数,用于获取std::variant中存储的值,并将其转换为指定的类型。

然而,std::variant::as并不是一个标准库中定义的成员函数。可能是由于笔误或误解导致了这个问题。正确的用法应该是使用std::get函数来获取std::variant中存储的值。

std::get函数接受一个类型参数和一个std::variant对象作为参数,并返回对应类型的值。如果std::variant中存储的值类型与指定的类型不匹配,将会抛出std::bad_variant_access异常。

以下是一个示例代码,展示了如何使用std::get函数获取std::variant中存储的值:

代码语言:txt
复制
#include <iostream>
#include <variant>

int main() {
    std::variant<int, double, std::string> myVariant = 3.14;

    try {
        double value = std::get<double>(myVariant);
        std::cout << "Value: " << value << std::endl;
    } catch (const std::bad_variant_access& e) {
        std::cout << "Failed to get value from variant: " << e.what() << std::endl;
    }

    return 0;
}

在这个示例中,我们创建了一个std::variant对象myVariant,并将一个double类型的值3.14存储在其中。然后,我们使用std::get<double>来获取存储的值,并将其转换为double类型。如果std::variant中存储的值类型与指定的类型不匹配,将会抛出std::bad_variant_access异常。

需要注意的是,std::variant可以存储多个不同类型的值,但在使用std::get函数获取值时,必须确保std::variant中存储的值类型与指定的类型匹配,否则会导致运行时错误。

关于std::variant的更多信息,您可以参考腾讯云的C++开发文档中关于std::variant的介绍:腾讯云C++开发文档 - std::variant

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何优雅的使用 std::variant 与 std::optional

std::variant与std::optional是c++17加入的新容器,variant主要是为了提供更安全的union, 而optional除了存取T类型本身外, 还提供了一个额外的表达optional...网上有不少std::variant与std::optional的介绍, 基础的部分基本都会讲到, 这里也先简单的过一下std::variant与std::optional的常规用法. 1. std::...答案是显然的, cppreference上的std::visit示例代码和参考链接中的第二篇就介绍了这种方法, 并与rust的enum做了简单对比, 通过引入的两行代码, 即能优雅的实现对std::variant...这两行代码的核心思路是创建一个overloaded对象, 然后从传入的多个lambda表达式继承他们的operator()操作符(Lambda表达式概念上就是提供了operator()操作符的函数对象)...相关使用代码简单易读. 3.2.3 aggregate initialization {}构造方式, 通过Class {}的方式来构造一个类, 我们不需要像平时的构造函数那样在类中指定它, 直接通过

3.8K10
  • std::variant和policy-based design的化学反应

    前言 通常来讲,C++的多态存在静态多态(函数重载)和动态多态(指针或引用+虚函数表),但是C++17引入新的特性——std::variant,为多态提供了新的实现方式。...同时,也为policy——based design提供了新的书写方式。 std::variant简介 std::variant在之前的文章中讲过,简单叙述如下,如需详细了解,可翻看前文。...std::variant是类型安全的多形态容器,存储预定义类型中的一个,结合std::visit函数可以根据variant中实际存储的类型调用访问者的相应重载方法。...结合std::variant和Policy-based design可以产生什么样的化学反应呢,今天提出基于std::variant的Policy-based design。...当使用std::variant实现该模式时,浅显易懂,较继承和模板的实现方式具有更高的可读性。

    8510

    C++17,标准库有哪些新变化?

    看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第二篇~ C++17 有许多新的标准库变化,简单起见,这篇文章只介绍了以下内容:std::string_view...,标准模板库中新添加的并行算法,新的文件系统库,以及3个新的数据类型:std::any, std::optional, 和 std::variant.让我们来了解一下其中的细节....9行代码中的 fs::current_path() 方法可以返回当前工作目录.你也可以使用 fs::create_directories 方法(代码第12行)创建层级目录. fs::path 重载了...(译注: 单子(Monad) 是函数式编程编程的概念,简单理解的话可以看看这里) 我们再来看下 std::variant. std::variant std::variant 是一个类型安全的联合体(union...).一个 std::variant 实例存储着其指定类型中某一类型的数据,并且 std::variant 的指定类型不能是引用类型,数组类型以及 void 类型,不过 std::variant 可以指定重复的数据类型

    1.3K10

    【翻译】C++17的新特性简介

    double类型作为模板参数的类型,因而也不能对其进行auto推断 折叠表达式(Folding expressions) 折叠表达式是为了优化C++11引入的参数包而生的。...,就是现在允许了当expr是一个类似tuple的对象时可以用auto [ x, y, z ] = expr;来初始化,对象中的元素会被绑定到x,y和z上 类似tuple的对象包括std::tuple,...log(msg); } std::variant 标准库模板类std::variant(变体/变种)代表了一个类型安全的union。...一个std::variant的实例每个时刻都只保留候选类型中的一个值(当然也可以是无值的),就像联合一样 std::variant v{ 12 }; std::get...可调用对象就是类似 std::function或 std::bind那样的可以类似普通的函数那样被调用的对象 template class Proxy { Callable

    3.1K10

    多态实现-虚函数、函数指针以及变体

    函数指针 就像常规指针指向一个数据的变量一样,函数指针是指向函数的变量。函数和数据都是存在于内存中,因此这些类型的指针实际上没有任何区别:它们都指向内存中某块地址。...std::variant std::variant是C++17引入的变体类型,它最大的优势是提供了一种新的具有多态性的处理不同类型集合的方法。...我们可以将其理解为union的升级版,之所以称之为升级版,是因为union有如下缺点: 对象并不知道它们现在持有的值的类型 不能持有std::string等非平凡类型 不能被继承 既然称之为union的升级版...,那么union的缺点其肯定不存在的,在此我们整理了下variant的特点: 可以获取当前类型 可以持有任何类型的值(不能是引用、C类型的数组指针、void等) 可以被继承 我们定义了一个如下类型变量v...虚函数机制是语言标准支持的,而std::variant则是通过另外一种方式来实现多态。基于std::variant的多态是否比传统的虚函数机制性能更优?

    96620

    C++17中新特性

    但是,C++11中的auto推导,往往结果与预期的不同。 c++11 中为了支持统一初始化,引入了新的统一初始化语法,如下所示。..., 新增了下面几种数据类型: 1. std::variant std::variant是类型安全的联合体,是一个加强版的 union,variant支持更加复杂的数据类型,例如map,string等等...2. std::optional std::optional表示一个可能存在的值。...需要注意的是,string_view 由于没有原始字符串的所有权,使用string_view 一定要注意原始字符串的生命周期。 当原始的字符串已经销毁,则不能再调用string_view。...bool 表达式不能用 ++, -- 这两个自增(减)运算符了 c++17中异常已经成为了类型系统的一部分, 枚举的直接列表初始化 结构化绑定 constexpr if 表达式 map支持merge和extract

    4.9K30

    C++中std::variant用法详解

    std::variant 是一个类型安全的联合体,可以存储固定集合中的任意类型的值。这使得 std::variant 成为处理那些可能需要存储不同类型数据的情况的理想选择。...std::visit:这是一种更为通用的访问 variant 的方法,它可以应用一个访问者(通常是一个 lambda 表达式或函数对象)到 variant 中存储的值上。这种方式支持运行时多态行为。...std::endl; } 类型冲突 在使用 std::variant 时需要注意,如果存储的类型有可能在语义上重叠或不明确(比如 std::variant),就需要特别注意操作和类型检查的准确性...好的实践和建议 使用 std::variant 虽然提供了很多便利,但也需要遵循一些最佳实践以确保代码的清晰性和性能: 最小化 std::variant 中类型的数量:虽然 std::variant 可以包含很多类型...保持 std::variant 简洁,只包含必要的类型。 **优先使用 std::visit**:std::visit 是处理 std::variant 的最安全和最灵活的方法。

    1.6K10

    C++17,optional, any, 和 variant 的更多细节

    https://blog.csdn.net/tkokof1/article/details/82660834 看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下...,这是第六篇~ std::optional, std::any, 和 std::variant 有一个共同特点:他们都支持就地构造.另外的,std::variant 还支持访问者模式....首先,我们要了解一下这3种数据类型的功能作用. std::optional 是一种可能包含也可能不包含某一类型对象的类型. std::variant 是一种类型安全的联合体 std::any 是一种可以包含任意类型..., std::vectorstd::variant> 就是我应用各种函数(即访问者)的被访问数据结构....现在,我想将各个 variant 的元素求和.求和之前,我需要在编译期确定所求和的结果类型,为此我使用了 std::common_type (代码第29行), std::common_type 可以给出

    2.4K20

    C++17 std::variant 详解:概念、用法和实现细节

    toc简介在C++的发展历程中,C++17带来了许多实用的新特性,其中std::variant尤为引人注目。它本质上是一种类型安全的联合体,能够在同一时刻持有多种可能类型中的某一个值。...而std::variant会自动跟踪当前存储的值的类型,开发者无需手动干预。其次,std::variant提供了更为友好和安全的访问方式,使得代码在处理不同类型数据时更加可靠和易于理解。...不过,使用时需注意,如果std::variant中当前存储的值并非所指定的类型,会抛出std::bad_variant_access异常。...return 0;}错误处理和访问未初始化的std::variant当std::variant未进行初始化,或者当前存储的值并非期望获取的类型时,调用std::get会抛出std::bad_variant_access...std::variant可以方便地存储和处理这些不同类型的参数。解析ini文件ini文件中的配置项可能有不同的数据类型,std::variant能有效地处理这种多类型数据的解析。

    6500

    C++ 中文周刊 第142期

    /12/cacheline.c 小于cacheline,带宽没啥区别,受cacheline影响了,大于cacheline,越大越快,理论上加入cacheline 64 拷贝128,应该获得翻倍的速度,但是实际上并不是...v = foo(); ... } 显然涉及到从std::variant不同参数的转换,怎么写?...(visitor{}, std::forward(from)); } 其实就是舍弃内部值本来的类型,用From硬推,匹配不到就失败 问题来了,如果是std::variant<const...有空测一下 互动环节 上一期提到的有问题的代码 int median(std::vector& v) { int mid = v.size() / 2; std::nth_element...上不复现我的提供的 10,10,29,18,10,10,10,10,13,32无法复现 只能说和平台也有点关系,巧合而已 突击提问:如何实现nth_element?

    10110
    领券