3个令人惊叹的C++17功能,让代码变得更简洁
一、简介C17 为 C 语言带来了许多功能。本文深入研究其中的三个它们有助于使编码更容易、更简洁、更直观和正确。本文从结构化绑定开始。结构化绑定适用于许多情况本文介绍几种情况可以使代码更简洁、更简单。介绍模板参数推导可以删除习惯键入的模板参数。最后介绍用“选择初始化”更好控制对象范围并允许定义它们所属的值。二、结构化绑定结构化绑定允许一次性定义多个对象其方式比以前的 C 版本更自然。从 C11 到 C17这个概念本身并不新鲜。C17以前始终可以从函数返回多个值并使用std::tie。例如展开代码语言C自动换行AI代码解释std::tuplechar, int, bool mytuple() { char a a; int i 123; bool b true; return std::make_tuple(a, i, b); }这返回三个不同类型的变量。要从 C17 之前调用函数访问这些函数要如下内容代码语言C自动换行AI代码解释char a; int i; bool b; std::tie(a, i, b) mytuple();其中必须在用前定义变量并预先了解类型。但是使用结构化绑定可以简单执行为代码语言C自动换行AI代码解释auto [a, i, b] mytuple();这是一种更好的语法几乎尽可能用auto与现代C样式也一致。那么什么可以与结构化绑定初始化一起使用呢基本上任何复合类型struct、pair和tuple。让我们看看它可能有用的几种情况。2.1、返回复合对象这是一次性将复合类型的各个部分如struct、pair等分配给不同变量并自动分配正确类型的简单方法。例如如果把数据插入到std::map中那么结果是一个std::pair。代码语言C自动换行AI代码解释std::mapchar,int mymap; auto mapret mymap.insert(std::pair(a, 100));可能有人想知道上面的代码为什么没有明确说明配对的类型这就是后面要讲的C17 中的模板参数推导了请接着往下阅读。因此为了确定数据插入是否成功可以从插入方法返回的内容mapret中提取second信息。问题在于读者应该需要查找什么才能确定是否插入成功。但是使用结构化绑定这将变成代码语言C自动换行AI代码解释auto [itelem, success] mymap.insert(std::pair(’a’, 100)); If (!success) { // Insert failure }其中itelem是元素的迭代器success的类型为booltrue用于表示插入成功。变量的类型是从赋值中自动推断出来的——这在阅读代码时更有意义。选择初始化作为本文最后一节的内容这里先睹为快由于 C17 现在具有选择初始化那么我们可以将其编写为代码语言C自动换行AI代码解释if (auto [itelem, success] mymap.insert(std::pair(‘a’, 100)); success) { // Insert success }这个稍后会详细介绍。2.2、遍历复合集合结构化绑定也适用于范围。因此考虑到前面的mymap定义在 C17 之前是使用如下所示的代码对其进行迭代代码语言C自动换行AI代码解释for (const auto entry : mymap) { // Process key as entry.first // Process value as entry.second }或者更明确地说代码语言C自动换行AI代码解释for (const auto entry : mymap) { auto key entry.first; auto value entry.second; // Process entry }但是结构化绑定允许更直接地编写它代码语言C自动换行AI代码解释for (const auto[key, value] : mymap) { // Process entry using key and value }变量key和value的用法比entry.first和entry.second更具指导意义并且不需要额外的变量定义。2.3、直接初始化但是由于结构化绑定可以从tuple、pair等进行初始化我们可以以这种方式进行直接初始化吗是的我们能。比如代码语言C自动换行AI代码解释auto a ‘a’; auto i 123; auto b true;它将变量a的初始值定义为char 类型的ai初始值为int类型的123以及b初始值为bool的类型的true。使用结构化绑定可以写成代码语言C自动换行AI代码解释auto [a, i, b] tuple(‘a’, 123, true); // With no types needed for the tuple!这将变量a、i、b定义得就像使用了上面的单独定义一样。这真的是对之前定义的改进吗已经在一行中完成了本来需要三行才能完成的工作但为什么要这样做呢考虑以下代码代码语言C自动换行AI代码解释{ istringstream iss(head); for (string name; getline(iss, name); ) // Process name }iss和name两者都只在for块内使用但必须在for语句之外和它自己的块内声明以便将范围限制在所需的范围内。这很奇怪因为iss是属于for循环。始终可以初始化相同类型的多个变量。例如代码语言C自动换行AI代码解释for (int i 0, j 100; i 42; i, --j) { // Use i and j }但我们想写但不能写的是代码语言C自动换行AI代码解释for (int i 0, char ch ‘ ‘; i 42; i) { // Does not compile // Use i and ch }使用结构化绑定我们就可以这样编写代码语言C自动换行AI代码解释for (auto[iss, name] pair(istringstream(head), string {}); getline(iss, name); ) { // Process name }和代码语言C自动换行AI代码解释for (auto[i, ch] pair(0U, ‘ ‘); i 42; i) { // The 0U makes i an unsigned int // Use i and ch }这允许根据需要在for语句的范围内定义变量iss和name以及i和ch并且还可以自动确定它们的类型。if和switch语句也是如此它现在在C 17中采用可选的选择初始化见下文。例如代码语言C自动换行AI代码解释if (auto [a, b] myfunc(); a b) { // Process using a and b }注意并不能用结构化绑定做所有事情试图让它们适应每种情况会使代码更加复杂。比如代码语言C自动换行AI代码解释if (auto [box, bit] std::pair(std::stoul(p), boxes.begin()); (bit boxes.find(box)) ! boxes.end()){ // Process if using both box and bit variables }此处box变量被定义为类型unsigned long并且具有从stoul(p)返回的初始值。对于那些不熟悉它的人来说stoul()是一个函数它以类型作为其第一个参数还有其他可选参数string- 包括std::string_base并将其内容解析为指定基数的整数默认为 10该函数作为无符号长整型值返回。

相关新闻

【C/C++】深入理解指针(五)

【C/C++】深入理解指针(五)

深入理解指针(五) 1.回调函数是什么? 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调用的函数就是回调函数。回调函数不…

2026/5/17 9:33:00 阅读更多 →
Flutter 三方库 ory_client 的鸿蒙化适配指南 - 掌控身份认证资产、精密 Identity 治理实战、鸿蒙级授权专家

Flutter 三方库 ory_client 的鸿蒙化适配指南 - 掌控身份认证资产、精密 Identity 治理实战、鸿蒙级授权专家

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 ory_client 的鸿蒙化适配指南 - 掌控身份认证资产、精密 Identity 治理实战、鸿蒙级授权专家 在鸿蒙跨平台应用执行高级身份识别管理与多维 Ory Cloud 资产指控&#xff08…

2026/7/3 1:13:40 阅读更多 →
ShardingSphere-jdbc 5.5.0 + spring boot 基础配置 - 实战篇

ShardingSphere-jdbc 5.5.0 + spring boot 基础配置 - 实战篇

ShardingSphere-jdbc 5.5.0 spring boot 基础配置 环境准备 版本数据库说明 集群 配置 配置文件Maven依赖spring boot配置shardingsphere-jdbc配置 自定义配置1:SM4加解密存储数据完整的基础配置 其他 雪花算法自定义worker.id 环境准备 版本 spring boot 2.…

2026/5/17 8:45:19 阅读更多 →

最新新闻

AI模型Web服务安全加固实战:从CSRF/XSS防护到生产部署

AI模型Web服务安全加固实战:从CSRF/XSS防护到生产部署

1. 项目概述:当AI视觉模型遇上Web安全最近在部署一个基于OFA(One-For-All)的图像语义蕴含模型服务时,我遇到了一个非常典型但又容易被忽视的问题:我们往往把绝大部分精力都花在了模型调优、接口性能优化上,…

2026/7/5 23:29:06 阅读更多 →
视频嵌入表示技术:从3D CNN到Transformer的实践指南

视频嵌入表示技术:从3D CNN到Transformer的实践指南

1. 视频嵌入表示生成方案概述视频嵌入表示(Video Embedding)是计算机视觉领域将原始视频数据转化为低维稠密向量的关键技术。不同于传统视频处理直接操作像素数据,嵌入表示通过深度学习模型提取视频的语义特征,形成固定长度的向量…

2026/7/5 23:29:06 阅读更多 →
GPT-4o与Claude 3.5 Sonnet模型选型实战指南

GPT-4o与Claude 3.5 Sonnet模型选型实战指南

该项目标题存在严重事实性错误与误导风险,不符合内容安全与专业规范要求。根据公开、权威、可验证的官方信息渠道(OpenAI官网、主流科技媒体如The Verge、TechCrunch、MIT Technology Review等2024年至今的持续追踪报道),截至目前…

2026/7/5 23:29:06 阅读更多 →
DC-DC降压转换器设计与PID控制优化实践

DC-DC降压转换器设计与PID控制优化实践

1. 项目背景与核心器件选型解析在电力电子领域,DC-DC降压转换器(Buck Converter)是最基础也最关键的拓扑结构之一。这次我们要实现的方案采用了171010550电源管理IC与PIC18F97J60微控制器的组合,这个搭配在工业控制领域颇具代表性…

2026/7/5 23:25:05 阅读更多 →
AutoUnipus:U校园全自动答题工具终极指南

AutoUnipus:U校园全自动答题工具终极指南

AutoUnipus:U校园全自动答题工具终极指南 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus 面对繁重的在线学习任务,你是否还在为U校园平台的网课作业而烦恼…

2026/7/5 23:23:04 阅读更多 →
XXE漏洞深度解析:从XML外部实体注入原理到实战防御

XXE漏洞深度解析:从XML外部实体注入原理到实战防御

1. 项目概述:为什么XXE漏洞至今仍是“隐形杀手”?在Web安全领域,SQL注入、XSS这些名词大家耳熟能详,但提到XXE(XML External Entity Injection,XML外部实体注入),很多开发者甚至安全…

2026/7/5 23:19:03 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻