结构化绑定optional(C++基础)

结构化绑定

处理多个返回值的操作:C++17提出

 之前多返回值喜欢用struct来返回。现在会做成元组,下图中设置C++17的版本,不要设置错为C语言标准。

#include<iostream>
#include<string>
#include<tuple>
std::pair<std::string, int> CreatPerson() {
	return { "lhx",25 };
}
std::tuple<std::string, int> CreatPerson2() {
	return { "lhx",25 };
}
std::tuple<std::string, int, int, int> CreatPerson1() {
	return { "lhx",25,1,1 };
}
int main() {
	auto person = CreatPerson1();
	std::string& name = std::get<0>(person);
	int& name = std::get<1>(person);
	 
	std::string name;
	int age;
	int age1;
	int age2;
	std::tie(name, age,age1,age2) = CreatPerson1();
	 
	//结构化绑定
	auto [name, age] = CreatPerson2();
}

在C++17结构化绑定之前我们使用tuple或者struct来接收数据,现在可以直接使用结构化绑定来解决。

optional

不能只使用data.value_or来判断文件是否存在,因为文件存在没有内容照样会输出

std::optional<std::string> ReadFileAsString(const std::string& filepath){
	std::ifstream stream(filepath);
	if (stream) {
		std::string result;
		stream.close();
		return result;
	}
	return {};
}
int main() {
	std::optional<std::string> data = ReadFileAsString("data1.txt");
	auto value = data.value_or("Not present");
	std::cout << value << std::endl;

	if (data.has_value()) {
		std::cout << "file read success";
	}
	else {
		std::cout << "file not opend";
	}
	std::cin.get();
}

所以直接选择optional类型,其可以用于表示值存不存在的问题,在处理这种打开是否有效的这种情况非常好用。

variant类型

variant可以声明变量可以是几种不同的类型值,与联合体不同的是,这几个值分别占各自的空间。

.index方法可以返回索引值,读取使用std::get<类型>()读取。

	std::variant<std::string, int> temp;
	temp = 111;
	temp.index();
	if (auto* ptr = std::get_if<std::string>(&temp)) {
		std::cout << "string!!" << "\n";
	}
	else {
		std::cout << "int!!!!" << "\n";
	}
	std::cout << std::get<std::string>(temp) << "\n";

问题:union和这个variant有什么不同?

union只能存储基本类型,不能存储std::string,并且内存只取最大的,而variant是定义之和。

问题:使用std::variant为什么定义了两种类型,一直只能使用一种类型,但是空间却还是两种类型的空间,为什么不能像联合体那样声明空间最大的类型的空间,而不是两者之和的空间。

std::variant的设计考虑了类型安全性和易用性,这是以牺牲一些额外的内存开销为代价的。虽然这看起来可能不如联合体那样高效,但std::variant提供的特性和安全性在很多情况下是非常有价值的。

union mutiType
{
	float test1;
	int test2;
};

int main() {
	std::variant<float, int> temp;
	mutiType test3;
	test3.test1 = 2.0f;
	test3.test2 = 1;
	std::cout << sizeof(int) << "\n";
	std::cout << sizeof(float) << "\n";
	std::cout << sizeof(test3) << "\n";
	std::cout << sizeof(temp) << std::endl;
}

还可以使用std::variant来代替optional进行值返回。

std::variant<std::string,int> ReadFileAsString(const std::string& filepath){
	std::ifstream stream(filepath);
	if (stream) {
		std::string result;
		stream.close();
		return result;
	}
	return 123;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/505722.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【跟着CHATGPT学习硬件外设 | 02】GPIO

文章目录 &#x1f680; 概念揭秘快速入门关键精华 &#x1f31f; 秒懂案例生活类比实战演练步骤1&#xff1a;硬件配置步骤2&#xff1a;软件配置步骤3&#xff1a;发送和接收数据步骤4&#xff1a;处理异常步骤5&#xff1a;优化操作手册硬件设计注意事项配置攻略准备阶段配置…

Docker配置Mysql

1.首页搜索mysql镜像 2.选择对应版本的MySQL&#xff0c;点击pull 3.pull完成以后&#xff0c;点击images&#xff0c;这里可以看到刚刚pull完成的mysql版本 4.打开命令界面&#xff0c;运行命令 docker images ,查看当前已经pull的images 5.运行命令设置mysql docker run -it…

OSCP靶场--Kyoto

OSCP靶场–Kyoto 考点(缓冲区溢出GPO滥用提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.31 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-31 08:08 EDT Nmap scan report for 192.168.216.31 Host …

14 - grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)

@[TOC](grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)) 空域法的基本思想是假设地面某区域的质量变化是由一系列位置已知、质量未知的质量块(小范围区域)引起的,那么将GRACE反演的结果归算到n个质量块上的过程就是泄露信号恢复的过程。个人理解是这样的:假定已知研…

Multi-task Lung Nodule Detection in Chest Radiographs with a Dual Head Network

全局头增强真的有用吗&#xff1f; 辅助信息 作者未提供代码

【跟小嘉学 Linux 系统架构与开发】二、Linux发型版介绍与基础常用命令介绍

系列文章目录 【跟小嘉学 Linux 系统架构与开发】一、学习环境的准备与Linux系统介绍 【跟小嘉学 Linux 系统架构与开发】二、Linux发型版介绍与基础常用命令介绍 文章目录 系列文章目录[TOC](文章目录) 前言一、 Linux 发行版(Linux distribution)介绍二、Centos 虚拟机初始化…

【Linux】socket套接字

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;IP地址和端口号pid和port的关系 &#x1f449;&#x1f3fb;TCP和UDP&#x1f449;&#x1f3fb;网络字节序&…

数据分析之Tebleau 的度量名称和度量值

度量名称 包含所有的维度 度量值 包含所有的度量 度量名称包含上面所有的维度&#xff0c;度量值包含上面所有的度量 当同时创建两个或两个以上度量或维度时&#xff0c;会自动创建度量名称和度量值 拖入省份为行(这会是还没有值的) 可以直接将销售金额拖到数值这里 或者将销售…

C++11 shared_from_this学习

最近学习网络变成发现一些C源码库中封装对象时会公有继承enable_shared_from_this&#xff1b; 用一个案例进行说明&#xff0c;案例代码如下&#xff1a; #include <iostream> #include <memory> #include <stdio.h>using namespace std;class C : public…

ComfyUI一直提示transformers需要升级,怎么解决?

&#x1f3a1;背景 最近通过秋叶的启动器使用Comfyui的时候&#xff0c;总是会有个弹窗提示transformers需要升级&#xff0c;你会发现&#xff0c;就算是更新了ComfyUI版本&#xff0c;升级了所有插件&#xff0c;升级了transformers库&#xff0c;这个提示仍然存在&#xff…

【Spring Security】 快速入门

文章目录 一、 身份认证Demo1、创建工程2、代码编写2.1、Controller2.2、Html2.3、application.properties配置 3、启动项目并访问 二、Spring Security 默认做了什么二、底层原理1.概述2.FiltersDelegatingFilterProxyFilterChainProxySecurityFilterChainSecurity Filters 三…

【docker】搭建Nexus私服

1、拉取镜像 docker pull sonatype/nexus3 2、运行镜像 docker run -d -p 10002:8081 -e NEXUS_CONTEXTnexus --name nexus-quick sonatype/nexus3 3、访问地址&#xff1a; http://localhost:10002/nexus &#xff01;&#xff01;&#xff01;注意我的端口号是…

数据结构--循环链表(C语言实现)

一.循环链表的设计 typedef struct CNode{ int data; struct CNode* next; }CNode ,*CList; 2.循环链表的示意图: 3.循环链表和单链表的区别: 唯一区别,没有空指针,尾节点的后继为头,为循环之意. 二.循环链表的实现 //初始化return true; }//返回key的前驱地址&#xff0c;如果…

查找--二分查找(Binary Search)

二分查找属于静态查找表&#xff0c;当以有序表表示静态查找表时&#xff0c;查找函数可用折半查找来实现。 查找过程&#xff1a;先确定待查记录所在的范围&#xff08;区间&#xff09;&#xff0c;然后逐步缩小范围直到找到或找不到该记录为止。 以处于区间中间位置记录的…

【Chiplet】技术总结

Chiplet基本知识点汇总 1. Wafer, die, chip, cell的区分2. MCM, SiP, SoC, Chiplet的区别4. Chiplets的先进封装5. Chiplet发展阶段 Chiplet基本知识点汇总 1. Wafer, die, chip, cell的区分 Wafer: 晶圆&#xff0c;指一整个晶圆硅片。 Die: 从晶圆上切分下来的小方格&a…

本地GPU调用失败问题解决3重新配置anaconda环境(成功)

1、右键“以管理员身份”打开anaconda prompt conda create -n python 3.9 2、使用官方下载源的配置 3、修改conda下载超时 conda config --set remote_connect_timeout_secs 60 conda config --set remote_read_timeout_secs 100 查看配置结果conda config --show 配置内…

HarmonyOS实战开发-slider组件的使用

介绍 本篇Codelab主要介绍slider滑动条组件的使用。如图所示拖动对应滑动条调节风车的旋转速度以及缩放比例。 相关概念 slider组件&#xff1a;滑动条组件&#xff0c;通常用于快速调节设置值&#xff0c;如音量调节、亮度调节等应用场景。 环境搭建 软件要求 DevEco Stu…

xftp突然无法连接虚拟机

问题描述 使用xftp连接虚拟机的时候一直显示 连接xxx.xxx.xx.xx失败 问题原因查找 首先打开本地cmd命令提示符 ping 你的虚拟机ip地址 我的是 ping 192.168.xx.xx 显示请求超时 解决方案&#xff1a; 点击打开更改适配器选项 右键vmnet 8——属性 如图前四个选项必选 单…

Linux:ip协议

文章目录 ip协议基本认识ip协议的报头 ip协议基本认识 前面对于TCP的内容已经基本结束了&#xff0c;那么这也就意味着在传输层也已经结束了&#xff0c;那么下一步要进入的是的是网络层&#xff0c;网络层中也有很多种协议&#xff0c;这里主要进行解析的是ip协议 前面的TCP…

【ensp实验】GRE和MGRE相关实验

要求&#xff1a; 1、R5为ISP,只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方 R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方; R3与R5之间使用HDLC封装; 3、R1、R2、R3构建一个MGRE环境&#…