C++17中的结构化绑定

      C++17中的结构化绑定(structured binding):将指定名称绑定到初始化程序的子对象或元素。简而言之,它们使我们能够从元组或结构中声明多个变量。与引用一样,结构化绑定是现有对象的别名;与引用不同,结构化绑定不必是引用类型(reference type)。

      C++17中结构化绑定的主要目的是使代码干净且易于理解。结构化绑定允许你在单个声明中将多个变量绑定到结构化对象的元素,例如std::tuple或struct。
      每个结构化绑定都有一个引用类型,该类型是decltype在应用于无括号的结构化绑定时返回的类型:E表示初始化表达式的类型

      (1).binding an array:标识符的数量必须等于数组元素的数量;每个标识符的引用类型是数组元素类型; 注意:如果数组类型是cv限定的,那么它的元素类型也是cv限定的

int arr1[3] = { 1, 2, 3 };

auto [x, y, z] = arr1; // 拷贝
std::cout << "x:" << x << ",y:" << y << ",z:" << z << "\n"; // x:1,y:2,z:3
x = 4;
std::cout << "arr1:" << arr1[0] << "\n"; // arr1:1

auto& [x2, y2, z2] = arr1; // 引用
std::cout << "x2:" << x2 << ",y2:" << y2 << ",z2:" << z2 << "\n"; // x2:1,y2:2,z2:3
x2 = 5;
std::cout << "arr1:" << arr1[0] << "\n"; // arr1:5

const auto& [x3, y3, z3] {arr1};
const auto& [x4, y4, z4](arr1);
std::cout << "x3:" << x3 << ",x4:" << x4 << "\n"; // x3:5,x4:5

      (2).binding a tuple-like type:表达式std::tuple_size<E>::value必须是格式正确的整型常量表达式,并且标识符的数量必须等于std::tuple_size<E>::value

std::tuple<std::string, int, float> foo{ "csdn", 8, 6.6 };

const auto& [x3, y3, z3] = foo;
std::cout << "x3:" << x3 << ",y3:" << y3 << ",z3:" << z3 << "\n"; // x3:csdn,y3:8,z3:6.6

auto& [x4, y4, z4] = foo;
x4 = "github";
y4 = 6;
z4 = 8.8;
std::cout << "foo:" << std::get<0>(foo) << "," << std::get<1>(foo) << "," << std::get<2>(foo) << "\n"; // foo:github,6,8.8

int a = 1, b = 2;
const auto& [x6, y6] = std::tie(a, b); // x6 and y6 are of type int&
x6 = 6;
auto [x7, y7] = std::tie(a, b); // x7 and y7 are still of type int&
std::cout << "x7:" << x7 << ",a:" << a << "\n"; // x7:6,a:6
x7 = 8;
std::cout << "x6:" << x6 << ",a:" << a << "\n"; // x6:8,a:8
if (&x6 != &x7)
	std::cout << "Error: &x6 != &x7\n"; // 不会执行

      (3).binding to data members:标识符的数量必须等于非静态数据成员的数量

namespace {

typedef struct Info {
	mutable std::string name;
	volatile int number;
} Info;

inline Info func()
{
	return Info{ "csdn", 666 };
}

typedef struct Data {
	int b{ 1 }, d{ 2 }, p{ 3 }, q{ 4 };
} Data;

} // namespace

const auto [x5, y5] = func();
std::cout << "x5:" << x5 << ",y5:" << y5 << "\n"; // x5:csdn,y5:666
x5 = "github";
//y5 = 888; //表达式必须是可修改的左值,需将const auto[x5, y5]调整为auto[x5, y5]

const auto [b1, d1, p1, q1] = Data{};
std::cout << "b1:" << b1 << ",d1:" << d1 << ",p1:" << p1 << ",q1:" << q1 << "\n"; // b1:1,d1:2,p1:3,q1:4

const auto [b2, d2, p2, q2] = Data{ 4, 3, 2, 1 };
std::cout << "b2:" << b2 << ",d2:" << d2 << ",p2:" << p2 << ",q2:" << q2 << "\n"; // b2:4,d2:3,p2:2,q2:1

Data s;
auto& [b3, d3, p3, q3] = s;
std::cout << "b3:" << b3 << ",d3:" << d3 << ",p3:" << p3 << ",q3:" << q3 << "\n"; // b3:1,d3:2,p3:3,q3:4

b3 = 4, d3 = 3, p3 = 2, q3 = 1;
std::cout << "s.b:" << s.b << ",s.d:" << s.d << ",s.p:" << s.p << ",s.q:" << s.q << "\n"; // s.b:4,s.d:3,s.p:2,s.q:1

      注意
      (1).结构化绑定无法受到约束;
      (2).lambda表达式无法捕获结构化绑定(C++20中可以);
      (3).必须确保在适当的时刻使用引用,尽量减少不必要的拷贝;
      (4).使用结构化绑定时,就不能再使用std::tie创建虚拟变量;
      (5).结构化绑定中有一个隐藏的匿名对象,结构化绑定时引入的新变量名其实都指向这个匿名对象的成员/元素;
      (6).可以在结构化绑定中使用修饰符,如const和引用,这些修饰符会作用在新的匿名实体上,而不是结构化绑定引入的新的变量名上;
      (7).理论上讲,结构化绑定适用于任何有public数据成员的结构体、C风格数组和"类似元组(tuple-like)的对象";
      (8).在任何情况下,结构化绑定中声明的变量名的数量都必须和元素或数据成员的数量相同;
      (9).使用结构化绑定需要继承时需要遵循一定的规则:所有的非静态数据成员必须在同一个类中定义(也就是说,这些成员要么是全部直接来自于最终的类,要么是全部来自同一个父类);并且只有当public成员的顺序保证是固定的时候你才应该使用结构化绑定;
      (10).结构化绑定机制是可拓展的,你可以为任何类型添加对结构化绑定的支持。标准库中就为std::pair<>、std::tuple<>、std::array<>添加了支持;

const std::map<std::string, std::string> addrs{
	{"csdn", "https://blog.csdn.net/fengbingchun/"},
	{"github", "https://github.com/fengbingchun"}
};

for (const auto& [key, val] : addrs) {
	std::cout << "key: " << key << ", addr: " << val << "\n"; // key: csdn, addr: https://blog.csdn.net/fengbingchun/
																// key: github, addr: https://github.com/fengbingchun
}

Info info{ "github", 888 };
auto&& [u, v] = std::move(info); // u和v指向的匿名实体是info的右值引用,同时info仍持有值
std::cout << "info.name:" << info.name << "\n"; // info.name:github
Info info2{ "csdn", 666 };
auto [u2, v2] = std::move(info2); // info2已失去了值
std::cout << "info2.name:" << info2.name << "\n"; // info2.name:

      执行结果如下图所示:

      GitHub:https://github.com/fengbingchun/Messy_Test

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

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

相关文章

微信小程序组件与插件有啥区别?怎么用?

目录 一、微信小程序介绍 二、微信小程序组件 三、微信小程序插件 四、微信小程序组件与插件有啥区别 一、微信小程序介绍 微信小程序是一种基于微信平台的应用程序&#xff0c;它可以在微信客户端内直接运行&#xff0c;无需下载和安装。微信小程序具有轻量、便捷、跨平台…

C语言——指针(四)

&#x1f4dd;前言&#xff1a; 上篇文章C语言——指针&#xff08;三&#xff09;对指针和数组进行了讲解&#xff0c;今天主要更深入的讲解一下不同类型指针变量的特点&#xff1a; 1&#xff0c;字符指针变量 2&#xff0c;数组指针变量 3&#xff0c;函数指针变量 &#x1…

职位招聘管理与推荐系统Python+Django网页界面+协同过滤推荐算法

一、介绍 职位招聘管理与推荐系统。本系统使用Python作为主要开发语言&#xff0c;以WEB网页平台的方式进行呈现。前端使用HTML、CSS、Ajax、BootStrap等技术&#xff0c;后端使用Django框架处理用户请求。 系统创新点&#xff1a;相对于传统的管理系统&#xff0c;本系统使用…

轻量封装WebGPU渲染系统示例<42>- vsm阴影实现过程(源码)

前向实时渲染vsm阴影实现的主要步骤: 1. 编码深度数据&#xff0c;存到一个rtt中。 2. 纵向和横向执行遮挡信息blur filter sampling, 存到对应的rtt中。 3. 将上一步的结果(rtt)应用到可接收阴影的材质中。 具体代码情况文章最后附上的实现源码。 当前示例源码github地址: …

优化你的计算机性能:如何根据 CPU 占用率决定硬件升级

优化你的计算机性能&#xff1a;如何根据 CPU 占用率决定硬件升级 一、引言二、CPU 占用率的意义与影响三、监测和评估 CPU 占用率四、判断硬件升级需求的依据五、硬件升级方案和建议六、总结 一、引言 计算机性能优化是提升计算机系统整体效能的过程&#xff0c;它对于用户和…

2023版本idea插件开发踩坑记录(一)

在进行idea开发的时候&#xff0c;开始仿照着写第一个插件hello world的时候&#xff0c;运行的时候一直运行不成功。参考了很多博客都是如此 后面对官方文档读了一遍&#xff0c;就发现其中的原委&#xff0c;这个的话估计会有很多人跟我一样踩坑 具体原因是&#xff0c;idea插…

Docker安装Oracle18c 坑已排完,放心食用

Docker安装Oracle18c 坑已排完,放心食用 0、有问题可邮件我1、拉取 oracle18c 镜像, 推荐使用 zhengqing版本的镜像2、启动容器3、等待容器启动完成, 这一步很慢很慢, 别着急4、进入容器5、修改管理员密码6、查看并设置环境变量7、设置监听模式支持以SID方式连接PDB数据库8、使…

Redis中的数据结构

文章目录 第1关&#xff1a;Redis中的数据结构 第1关&#xff1a;Redis中的数据结构 这是上篇文章的第一关&#xff0c;只不过本篇是代码按行做的&#xff0c;方便一下大家使用。 代码如下&#xff1a; redis-cliset hello redislpush educoder-list hellorpush educoder-lis…

HCIP-十六、IGMPPIM-SM 组播

十六、IGMP&PIM-SM 组播 IGMP实验拓扑实验需求及解法1. 配置各设备IP地址2. R1启用组播功能&#xff0c;并在g0/0/0和g0/0/1上开启pim dm3. R1的g0/0/1开启igmp协议 PIM-SM实验拓扑实验需求及解法1.配置各设备IP地址。2.运行IGP3.R1/2/3/4运行PIM-SM IGMP 实验拓扑 实验需…

国际语音通知是什么?国际语音通知系统有哪些功能?

一、国际语音通知是什么&#xff1f; 如同国际短信通知&#xff0c;国际语音通知也在多种生活场景中扮演着重要的角色&#xff0c;如会议通知、商品发货通知、物流更新通知、快递取件通知、外卖取餐通知等。那么什么是语音通知呢&#xff1f; 国际语音通知可将通知的文本信息使…

PT读spef报PARA-006如何解决?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 There are multiple causes that can trigger PARA-006 errors. Here is a checklist. 1) SPEF reading order Functionally, the parasitic files can be read in any order. For best stitching…

【STM32】STM32学习笔记-STM32简介(02)

00. 目录 文章目录 00. 目录01. STM32简介1.1 STM32是什么1.2 STM32应用领域1.3 STM32命名规则1.4 STM32选型 02. ARM简介2.1 ARM是什么2.2 ARM系列 03. STM32开发板3.1 MCU简介3.2 STM32开发板3.3 STM32硬件资源 04. STM32系统架构05. STM32引脚定义06. STM32启动配置07. STM3…

基于AI模型实现行政区识别

pytorch环境搭建 下载pytorch与CUDA会快一些&#xff0c;在本地下载好了pytorch的whl文件后&#xff0c;直接在下载目录中打开cmd窗口&#xff0c;使用pip install xxxx.whl安装pytorch即可。 RaNER 模型搭建与运行 进入魔塔官网&#xff0c;找到MGeo模型&#xff0c;首先必…

中国消费电子行业发展趋势及消费者需求洞察|徐礼昭

一、引言 近年来&#xff0c;随着科技的飞速发展&#xff0c;消费电子行业面临着前所未有的挑战与机遇。本文将从行业发展趋势、消费者需求洞察以及企业数字化转型的方向和动作三个方面&#xff0c;对消费电子行业进行深入剖析。 二、消费电子行业发展趋势 5G技术的普及和应…

二叉树的根到叶子几点之和

输入&#xff1a;root [1,2,3] 输出&#xff1a;25 解释&#xff1a; 从根到叶子节点路径 1->2 代表数字 12 从根到叶子节点路径 1->3 代表数字 13 因此&#xff0c;数字总和 12 13 25 输入&#xff1a;root [1,0,1,0,1,0,1] 输出&#xff1a;22 解释&#xff1a;(1…

mac安装解压缩rar后缀文件踩坑

mac默认能够解压缩zip后缀的文件&#xff0c;如果是rar后缀的自己需要下载相关的工具解压 下载地址&#xff1a; https://www.rarlab.com/download.htm mac我是因特尔芯片所以下载 x64 然后解压缩文件进入目录 rar中 将可执行文件 rar、unrar 移动到 /usr/local/bin目录下即…

PAD平板签约投屏软件要如何选

又是一年年底了&#xff0c;年会开始多起来了&#xff0c;许多会务公司或活动公司会接到很多平板签约投屏业务&#xff0c;如年会中的签军令状、业绩保证书等。这时就面临选购一套签约投屏软件了。 目前的签约投屏软件&#xff0c;大多以H5做的网页版的多&#xff0c;但我建议…

数据库管理-第121期 我为什么写文章(202301203)

数据库管理-第121期 我为什么写文章&#xff08;202301203&#xff09; 其实呢~大周末我不是太想写文章的&#xff0c;周五HaloDB起了个头还有一堆可以做的事情都计划到下周了&#xff0c;但是昨天发生了一件事情&#xff0c;让我很是不开心&#xff1a;强盗逻辑&#xff0c;白…

F2B2b营销中台与经销商数据打通-加速业务增长

经销商与营销中台集成的重要性以及如何利用数据集成平台实现协同发展与数字化转型。 随着市场竞争的日益激烈&#xff0c;传统的经销商业务模式面临着巨大的挑战。而营销中台的出现为经销商提供了一个强大的助力。营销中台作为一个集成了各类数字营销工具和数据的平台&#xff…

算法复习,数据结构 ,算法特性,冒泡法动态演示,复杂度,辗转相除法*,寻找最大公因数

算法复习 知识点 1. 程序 数据结构 算法 2. 算法&#xff1a; 求解问题的策略数据结构&#xff1a;问题的数学模型程序&#xff1a;微计算机处理问题编制的一组指令 3. **特性 ** 有穷性&#xff1a;算法在执行有穷步后能结束确定性&#xff1a;每一指令有确切的含义&a…