首页 > 其他分享 >std::variant快速上手

std::variant快速上手

时间:2024-09-18 17:01:32浏览次数:9  
标签:std 存储 cout variant 访问 类型 快速

std::variant 是 C++17 引入的一种类型安全的联合体,用来存储多个可能类型中的一种值,且保证使用时的类型安全。相比于传统的 unionstd::variant 不仅能够存储不同类型的值,还能自动管理复杂类型的构造与析构。接下来,介绍如何快速上手 std::variant

1. 定义 std::variant

使用 std::variant 可以定义一个变量,该变量可以持有多种不同类型的值,但一次只能存储一种。

#include <iostream>
#include <variant>

int main() {
    std::variant<int, float, std::string> v;  // v 可以是 int、float 或 std::string

    // 设置为 int 类型
    v = 42;
    std::cout << std::get<int>(v) << std::endl;

    // 设置为 float 类型
    v = 3.14f;
    std::cout << std::get<float>(v) << std::endl;

    // 设置为 std::string 类型
    v = "Hello, std::variant!";
    std::cout << std::get<std::string>(v) << std::endl;

    return 0;
}

2. 访问 std::variant 的值

std::variant 的值可以通过 std::get<type>std::get<index> 访问。

std::variant<int, float, std::string> v = 42;

// 使用类型访问
std::cout << std::get<int>(v) << std::endl;

// 使用索引访问,0 表示第一个类型
std::cout << std::get<0>(v) << std::endl;

注意:

  • 如果你尝试访问的类型与当前存储的类型不匹配,程序会抛出 std::bad_variant_access 异常。
std::variant<int, float, std::string> v = 42;
try {
    std::cout << std::get<float>(v);  // 当前不是 float 类型,会抛出异常
} catch (const std::bad_variant_access& e) {
    std::cout << "Wrong type access: " << e.what() << std::endl;
}

3. 检查当前类型

你可以使用 std::holds_alternative<T>(variant) 来判断 std::variant 当前是否持有某种类型。

if (std::holds_alternative<int>(v)) {
    std::cout << "v holds an int" << std::endl;
}

4. 访问当前存储类型的索引

你可以使用 v.index() 获取当前存储值的类型在 std::variant 中的索引。

std::cout << "Index: " << v.index() << std::endl;  // 0 表示 int,1 表示 float,依次类推

5. 使用 std::visit 访问 std::variant

std::visitstd::variant 的一个访问工具,它使用一个可调用对象(如 lambda 表达式或函数)来访问 std::variant 的值,而无需手动判断当前的类型。

#include <iostream>
#include <variant>
#include <string>

int main() {
    std::variant<int, float, std::string> v = "Hello";

    std::visit([](auto&& arg) {
        std::cout << arg << std::endl;  // 打印不同类型的值
    }, v);

    return 0;
}

6. 常见应用场景

  • 存储多种类型的值:当需要一个变量存储多种可能的类型时,std::variantunion 更灵活和安全。
  • 事件系统:可以使用 std::variant 来构建一种通用的事件系统,不同事件类型对应不同的 variant
  • 解析数据:如解析 JSON 或 XML 等格式化数据,数据字段可能是不同的类型。

小结

  • std::variant 可以存储多个类型之一,并且类型安全。
  • 通过 std::get<type>std::get<index> 访问值。
  • 使用 std::holds_alternative 判断存储类型,使用 std::visit 处理不同类型的值。

标签:std,存储,cout,variant,访问,类型,快速
From: https://www.cnblogs.com/niumachen/p/18418899

相关文章

  • 【北京迅为】iTOP-LS2K0500开发板快速使用编译环境ubuntu20.04第一章加载迅为提供 Ubu
    iTOP-LS2K0500开发板从CPU自主指令系统到开发板每一个元器件,做到100%全国产化。        【公众号】迅为电子,了解更多资讯-----------------------  第一章 加载迅为提供 Ubuntu20.041.1安装虚拟机VMware软件这里我们使用的是VMware15.5版本,当然其他版本也是可以,比如......
  • 【北京迅为】iTOP-LS2K0500开发板快速使用编译环境ubuntu20.04第一章加载迅为提供 Ubu
      iTOP-LS2K0500开发板从CPU自主指令系统到开发板每一个元器件,做到100%全国产化。        【公众号】迅为电子,了解更多资讯-----------------------  第一章加载迅为提供Ubuntu20.041.1安装虚拟机VMware软件这里我们使用的是VMware15.5版本,当然......
  • 高效数据移动指南 | 如何快速实现数据库 MySQL 到 MongoDB 的数据同步?
    在现代企业中,数据无处不在,贯穿于各个业务环节和系统之间。无论是跨系统的数据集成、多地域的数据协同,还是实时应用的数据同步,数据的一致性和及时性都至关重要。在数字化转型的过程中,如何确保不同系统、地域、设备之间的数据同步,成为了企业面临的重要挑战。本专题将基于实践经验,从......
  • 何为快速育种(Speed Breeding)?
    所谓“SpeedBreeding”(简称“SB”,额~),就是在环境可控的人工气候室中,通过改变光周期来加速植物的生长周期,从而起到加速育种的目的。快速育种:加速作物研究和育种的强大工具2017年7月9日,澳大利亚昆士兰大学LeeHickey团队领衔在预印本网站bioRxiv上发表了“SpeedBreeding”技术的详细......
  • u盘恢复数据,快速找回删除文件,请认准这4招
    U盘,作为我们日常生活中常见的存储工具,里边可能放着工作文档、学习资料或拍摄的美照。如果你在电脑上使用U盘时,不小心将数据删除了,该怎么办呢?别担心,关于u盘恢复数据,文章有办法可解!跟着小编的脚步,一起探索4招神器的恢复技巧吧!方法一:使用命令提示符,恢复u盘数据对于熟悉计算机......
  • 文心一言智能体创建教程——快速生成一个自己的专属智能体
    一、引言智能体(Agent)是人工智能领域中的一个核心概念,它通常指能够在特定环境中自主行动、感知环境、处理信息并做出决策的软件实体或硬件系统。对于初学者来说,开发一个基本的智能体可能看起来很复杂,但通过分解任务和逐步实践,你可以逐步掌握这一技能。本指南将引导你从零开始,了解并......
  • 【CMake】使用CMake在Visual Stdudio中配置glad和glfw
    下载glad和glfwgladgladglad下载:glad下载这个是......
  • 如何批量缩短长链接?简单三步,快速提升工作效率!
    在如今的线上推广领域,链接扮演着至关重要的角色。然而,长链接却存在诸多弊端,比如占用字符过多、影响排版美观、点击率欠佳,且生成的二维码过于复杂影响识别。因此,许多小伙伴会借助短网址生成器,将长链接转化为短链接后加以使用。但不少生成器要么只能逐条生成,要么一次最多生成10......
  • 【CMake】使用CMake在Visual Stdudio编译资源文件和多目标编译
    一、资源文件的编译首先,我们的项目结构如下,存在图片和第三方库:配置主CMakel......
  • VScode快速配置c++(菜鸟版)
    1.vscode是什么VisualStdioCode简称VSCode,是一款跨平台的、免费且开源的现代轻量级代码编辑器,支持几乎主流开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段提示、代码对比等特性,也拥有对git的开箱即用的支持。同时,它还支持插件扩展,通过丰......