首页
学习
活动
专区
工具
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::variantstd::optional

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

2.9K10

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.2K10

【翻译】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

2.9K10

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

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

89120

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.8K30

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 最安全和最灵活方法。

28310

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::vector 就是我应用各种函数(即访问者)被访问数据结构....现在,我想将各个 variant 元素求和.求和之前,我需要在编译期确定所求和结果类型,为此我使用了 std::common_type (代码第29行), std::common_type 可以给出

2.3K20

linux环境下时间编程

本文并不会涉及定时器(timer),timer和时间有着关联,而且timer对于程序员来说是极为重要,但介绍timer接口将会花费相当可观篇幅,那样多少会使本文离题,所以请允许我在另外文章中单独讨论...monotonic time 单调时间,意思是不能被设置和影响时间,因此相比系统时钟它可以提供更精确是时间信息,也不会出现时间跳跃。...首先我们系统处于UTC+8时区,我们设置tm为1970年1月1日,因此mktime应该返回0,但当我们用ctime输出本地时间时却发现时间仍然在1970/1/1 0:00:00,而没有如我们预期那样...获取struct tm除了像我一节那样手动指定成员值之外,还有若干标准库函数可供使用: // mktime不再赘述,它除了转换tm到time_t之外还可以根据给出字段自动将tm设置成合理值 /...结果是28800秒,也就是8小时,我们所在时区是UTC+8,符合预期

3.3K30
领券