当前位置: 首页 > article >正文

C++17 之结构化绑定(Structured Bindings)

C17 之结构化绑定Structured Bindings在 C11 时代我们用auto推导类型用range-based for遍历容器代码简洁了不少。但当你想从std::pair或std::tuple里取出值时还是得写一堆std::get或.first.second既啰嗦又不直观。C17 带来了结构化绑定Structured Bindings一行代码就能优雅地解构复合类型——就像 Python 的解包语法一样丝滑。一、为什么需要结构化绑定先看一个典型的场景函数返回一个std::pair你想拿到里面的值。C11/14 的写法std::pairstd::string,intgetUserInfo(){return{LinXi,25};}intmain(){autoinfogetUserInfo();// 方式一.first / .secondstd::string nameinfo.first;intageinfo.second;// 方式二std::get更明确但更啰嗦// std::string name std::get0(info);// int age std::get1(info);}问题很明显.first.second的名字完全没有语义看到代码的人根本不知道哪个是名字、哪个是年龄如果是std::tupleint, double, std::string, bool这种多元素类型用std::getN更是噩梦你还得额外声明一个临时变量来承接返回值C17 的结构化绑定完美解决了这些问题intmain(){auto[name,age]getUserInfo();std::coutname is age years old.std::endl;}一行搞定。变量名即语义。清爽。二、语法详解结构化绑定的基本语法是auto[变量1,变量2,...]表达式;这里有三种形式取决于你要绑定的目标类型形式一绑定到数组intarr[]{1,2,3};auto[a,b,c]arr;// a1, b2, c3数组元素的数量必须和绑定变量的数量严格一致否则编译报错。形式二绑定到 tuple-like 类型适用于std::pair、std::tuple、std::array等以及任何实现了std::tuple_size和std::tuple_element的自定义类型。auto[x,y]std::make_pair(10,20);// pairauto[a,b,c]std::make_tuple(1,2.0,hi);// tuple形式三绑定到结构体/类的 public 成员这是最灵活也最实用的形式——直接绑定到结构体的成员变量structPoint{doublex;doubley;};Point p{3.14,2.71};auto[x,y]p;// x3.14, y2.71要求成员必须是public的非静态数据成员且不能使用位域bitfield。绑定变量的数量必须和非静态数据成员的数量一致。三、实战示例示例 1遍历 map 的优雅方式在 C11 中遍历std::map是每个开发者都写过的代码// C11 风格std::mapstd::string,intscores{{Alice,90},{Bob,85}};for(autokv:scores){std::coutkv.first: kv.secondstd::endl;}有了结构化绑定// C17 风格for(auto[name,score]:scores){std::coutname: scorestd::endl;}kv.first、kv.second变成了有意义的name、score。代码的可读性提升了一个档次。示例 2函数返回多个值C 函数只能有一个返回值我们通常用std::tuple来返回多个值#includetuple#includestringstd::tuplestd::string,int,doublegetStudent(){return{Alice,20,3.85};}intmain(){// C11啰嗦autostudentgetStudent();std::string namestd::get0(student);intagestd::get1(student);doublegpastd::get2(student);// C17优雅auto[name2,age2,gpa2]getStudent();std::coutname2, age age2, GPA gpa2std::endl;}示例 3绑定自定义结构体structSensorData{std::string id;doubletemperature;doublehumidity;boolis_online;};SensorDatareadSensor(){return{sensor_01,25.6,60.3,true};}intmain(){auto[id,temp,hum,online]readSensor();if(online){std::cout[id] 温度: temp°C, 湿度: hum%std::endl;}}比起data.id、data.temperature、data.humidity……这种写法在数据字段多的时候尤其舒服。示例 4配合 if 语句使用绑定到已有变量结构化绑定的变量声明可以放在if或switch的初始化语句中#includemap#includestring#includeiostreamintmain(){std::mapstd::string,intscores{{Alice,90},{Bob,85}};// 结构化绑定 if init-statementC17 另一特性if(auto[it,success]scores.emplace(Charlie,95);success){std::coutInserted: it-first - it-secondstd::endl;}// 结构化绑定 for 循环for(auto[name,score]:scores){std::coutname: scorestd::endl;}}这个示例展示了结构化绑定与 C17 的 init-statement 特性结合使用可以写出非常紧凑的防御性代码。四、注意事项与陷阱1. 绑定变量是副本值拷贝structPoint{intx;inty;};Point p{1,2};auto[a,b]p;// a 和 b 是 p.x 和 p.y 的副本a10;// 不会影响 p.x2. 使用引用避免拷贝auto[a,b]p;// 引用绑定修改 a 会改变 p.xconstauto[a,b]p;// const 引用只读这和普通的auto/auto/const auto规则完全一致。3. 移动语义auto[a,b]std::move(pairObj);// 移动构造pairObj 之后处于有效但未指定的状态4. 没有丢弃占位符和 Python 不同C17 的结构化绑定没有专门的占位符来丢弃不需要的值。_在 C17 中只是一个普通的合法标识符auto[a,_,c]myTuple;// ✅ 编译通过_ 是一个普通变量可能产生未使用变量警告C26 才引入了真正的占位符语法_不再引入名称。在 C17 中如果确实想忽略某个值只能绑定后忽略或改用std::get按需取值。5. 不能用于初始化列表auto[a,b]{1,2};// ❌ 编译错误结构化绑定只能绑定到数组、tuple-like 类型或 struct 的 public 成员。6. 作用域结构化绑定的变量作用域和普通auto变量一致——从声明处开始到所在块结束。五、与 C11/14 的对比场景C11/14 写法C17 结构化绑定取 pair 值auto p func(); p.first; p.second;auto [x, y] func();取 tuple 值std::get0(t); std::get1(t);auto [a, b] t;遍历 mapfor (auto kv : m) { kv.first; kv.second; }for (auto [k, v] : m) { ... }返回结构体字段auto result func(); result.id; result.name;auto [id, name] func();结论结构化绑定不是什么颠覆性的新功能但它解决了日常编码中反复出现的取值啰嗦问题。代码更短、更清晰、更有表达力。六、编译器支持结构化绑定是 C17 标准的一部分主流编译器均已支持编译器最低版本GCC7.02017 年 5 月Clang5.02017 年 9 月MSVCVS 2017 15.32017 年 7 月编译时记得加上 C17 标志g-stdc17 main.cpp-omain clang-stdc17 main.cpp-omain cl /std:c17 main.cpp总结结构化绑定是 C17 中最常用、最实用的新特性之一。它用简洁的语法解决了长期困扰开发者的解构问题✅代码更简洁一行代码替代多行std::get或.first.second✅可读性更强变量名即语义一眼看懂每个值的含义✅适用范围广数组、pair、tuple、结构体通吃✅零运行时开销纯编译期特性不会影响性能养成使用结构化绑定的习惯你会发现自己的 C 代码变得更加优雅和现代。下一篇预告C17 引入的另一个编译期利器——if constexpr编译期条件分支。它让你在模板元编程中彻底告别 SFINAE 的痛苦敬请期待

相关文章:

C++17 之结构化绑定(Structured Bindings)

C17 之结构化绑定(Structured Bindings)在 C11 时代,我们用 auto 推导类型,用 range-based for 遍历容器,代码简洁了不少。但当你想从 std::pair 或 std::tuple 里取出值时,还是得写一堆 std::get 或 .firs…...

MAA明日方舟自动化助手终极指南:一键解放双手的完整解决方案

MAA明日方舟自动化助手终极指南:一键解放双手的完整解决方案 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https…...

如何快速掌握so-vits-svc:语音转换的完整实践指南

如何快速掌握so-vits-svc:语音转换的完整实践指南 【免费下载链接】so-vits-svc SoftVC VITS Singing Voice Conversion 项目地址: https://gitcode.com/gh_mirrors/so/so-vits-svc SoftVC VITS Singing Voice Conversion(简称so-vits-svc&#x…...

向AI证明“我不是AI”?2026年毕业生必须搞懂的降重降AIGC问题,今天交给宏智树AI一次说清

宏智树AI官网:www.hzsxueshu.com | 微信公众号搜一搜:宏智树AI 大家好,我是你们的论文科普博主,专门帮大家攻克论文写作的各种疑难杂症。 如果你正在经历毕业季,一定听说过这样的场景:有人把《滕王阁序》…...

Godot引擎官方文档:开源协作、架构解析与高效使用指南

1. 项目概述:一份开源游戏引擎的“官方说明书”如果你正在使用或者考虑使用 Godot 引擎来开发你的下一款游戏,那么你迟早会与一个名为godotengine/godot-docs的仓库打交道。这不仅仅是 Godot 的官方文档,它更像是一本由全球开发者共同维护、持…...

119,376个英语单词发音MP3音频下载:一键获取完整发音库的终极指南

119,376个英语单词发音MP3音频下载:一键获取完整发音库的终极指南 【免费下载链接】English-words-pronunciation-mp3-audio-download Download the pronunciation mp3 audio for 119,376 unique English words/terms 项目地址: https://gitcode.com/gh_mirrors/e…...

3步实现AI视频智能分析:从视频到结构化报告的全新工作流

3步实现AI视频智能分析:从视频到结构化报告的全新工作流 【免费下载链接】video-analyzer Analyze videos using LLMs, Computer Vision and Automatic Speech Recognition 项目地址: https://gitcode.com/gh_mirrors/vi/video-analyzer 你是否曾面对海量视频…...

AI代码生成新范式:用结构化蓝图引导Claude生成高质量项目代码

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫faizkhairi/claude-code-blueprint。乍一看这个标题,你可能会觉得有点抽象——“Claude代码蓝图”?这到底是个啥玩意儿?作为一个在代码生成和AI辅助开发领域摸爬滚打…...

告别Parallels:M1/M2 Mac用免费UTM跑Win11,性能与体验实测分享

M1/M2 Mac用户终极指南:UTM虚拟机运行Windows 11的完整解决方案 当苹果宣布转向自研芯片时,许多依赖虚拟化技术的用户都感到担忧。作为长期使用Parallels Desktop的专业用户,我也曾对Apple Silicon的虚拟化能力持怀疑态度。但经过半年多的实际…...

OpenClaw(小龙虾)Windows10/11 64 位一键部署教程|流畅运行稳定在线

OpenClaw(小龙虾)是面向 Windows 平台的本地 AI 智能体工具,全程可视化界面操作,不用命令行、不用手动配置环境,内置全套运行依赖,短时间内即可完成部署,新手也能顺畅上手。 适配系统与当前版本…...

如何在PC上完美运行Switch游戏:终极免费模拟器Ryujinx完整指南

如何在PC上完美运行Switch游戏:终极免费模拟器Ryujinx完整指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想在电脑上畅玩《塞尔达传说:旷野之息》或《马里…...

对比 LangChain Agent / Deep Agents / LangGraph 的真实代码差异

LangChain Agent vs Deep Agents vs LangGraph 真实代码对比 下面用同一个业务场景(“研究助手:搜索资料 写报告”)三种实现方式对比,让你一眼看出差异。 一、对比总览(先看结论) 维度LangChain AgentDe…...

Gitee SCA:为企业级开源治理构筑自动化防线

在数字化转型的大潮中,开源软件已成为企业技术栈不可或缺的组成部分。最新行业数据显示,全球范围内超过90%的企业在软件开发过程中依赖开源组件,这一比例在中国市场同样居高不下。然而,开源组件的广泛使用也带来了新的安全挑战——…...

Scipy优化踩坑实录:trust-constr和SLSQP约束定义到底差在哪?

Scipy优化实战:trust-constr与SLSQP约束定义差异深度解析 第一次接触Scipy的优化模块时,我被文档里琳琅满目的算法选项晃花了眼。特别是当问题需要加入约束条件时,trust-constr和SLSQP这两种主流方法对约束的定义方式完全不同——一个要求构造…...

中国词元:构建自主AI生态的“黄金三角“

中国正在人工智能领域掀起一场深刻的生态重构革命。“中国词元"这一创新概念——由国产大模型、国产GPU和绿色能源构成的"黄金三角”,正成为打破西方技术垄断、构建自主可控AI基础设施的核心路径。在这场关乎国家科技未来的战略布局中,模力方舟…...

Gitee CodePecker SCA vs OpenSCA:企业级软件供应链安全工具深度评测

在数字化转型浪潮席卷全球的当下,软件供应链安全已成为企业不可忽视的核心议题。随着开源组件在软件开发中的广泛应用,如何有效识别和管理其中的安全风险,成为研发团队必须面对的挑战。本文将对两款主流的软件成分分析(SCA)工具——Gitee Cod…...

Gitee CodePecker SCA与OpenSCA深度评测:企业级软件供应链安全工具如何选?

在数字化浪潮席卷全球的今天,软件供应链安全已成为企业数字化转型过程中不可忽视的重要议题。随着开源组件在软件开发中的广泛应用,软件成分分析(SCA)工具正从可选变为必选。面对市场上众多的SCA解决方案,企业如何选择…...

Win11 环境下,自定义安装目录部署 Claude Code 调用Xiaomi MIMO大模型

一、准备工作(前置检查)确认网络环境 你的网络需要能正常访问 claude.ai 服务(否则安装和后续使用都会失败)。建议先在浏览器打开 https://claude.ai,确认可以正常访问。新建自定义安装目录 比如你想装到 D:\Agent\Cla…...

事件驱动AI代理框架:构建生产级智能体的状态管理与工作流编排

1. 项目概述:为什么我们需要一个“事件驱动”的代理框架?如果你最近在关注AI应用开发,尤其是基于大语言模型(LLM)构建的智能体(Agent)或自动化工作流,那你大概率已经感受到了一个痛点…...

量子深度学习系统架构与优化实践

1. 量子深度学习系统架构解析 量子深度学习(Quantum Deep Learning, QDL)作为量子计算与经典机器学习的交叉领域,其系统架构设计直接决定了算法能否在现有硬件条件下实现预期性能。当前主流的QDL系统通常采用分层设计理念,从下至上…...

《信息系统项目管理师教程(第4版)》——信息技术发展

在《信息系统项目管理师教程(第4版)》中,“信息技术发展”(第2章)是紧随“信息化发展”之后的“硬核理科生”章节。如果说第1章是带你俯瞰国家战略,那第2章就是把你拉回机房的机柜前,直面服务器…...

XYBot V2微信机器人:插件化架构解析与从零部署实战

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫XYBot V2。这是一个基于Python的微信机器人框架,功能相当丰富,从基础的AI聊天、新闻推送,到积分系统、小游戏,再到完善的插件化管理,基本上把你能…...

Java-RPG-Maker-MV-Decrypter:3步轻松解密RPG游戏资源的终极免费工具

Java-RPG-Maker-MV-Decrypter:3步轻松解密RPG游戏资源的终极免费工具 【免费下载链接】Java-RPG-Maker-MV-Decrypter You can decrypt whole RPG-Maker MV Directories with this Program, it also has a GUI. 项目地址: https://gitcode.com/gh_mirrors/ja/Java-…...

AISMM安全维度终极对照表:对比NIST AI RMF、ISO/IEC 23894与欧盟AI Act,标注17处中国特有监管适配项

更多请点击: https://intelliparadigm.com 第一章:AISMM安全维度终极对照表的理论根基与时代意义 AISMM(AI-Specific Security Maturity Model)并非传统安全模型的简单平移,而是植根于AI系统全生命周期特性的范式重构…...

AISMM模型实战解析:3步完成云原生成熟度自评,附Gartner验证的7项关键指标清单

更多请点击: https://intelliparadigm.com 第一章:AISMM模型与云原生成熟度 核心理念与演进逻辑 AISMM(AI-Driven Service Mesh Maturity Model)是面向云原生环境的多维成熟度评估框架,聚焦服务网格、可观测性、AI赋…...

AI结对编程实战:PAIR REPL工具在终端中的高效应用

1. 项目概述:当AI成为你的结对编程伙伴 如果你和我一样,每天大部分时间都泡在终端和代码编辑器里,那你肯定对“效率”这个词有执念。从代码补全、静态检查到自动化脚本,我们总在寻找能让自己编码更流畅、思考更专注的工具。最近&a…...

使用 python 快速接入 taotoken 并调用多模型完成聊天任务

使用 Python 快速接入 Taotoken 并调用多模型完成聊天任务 基础教程类,指导 Python 开发者使用官方的 OpenAI 风格 SDK,通过配置 api_key 与 base_url 指向 Taotoken 端点,并指定模型 ID 来调用聊天补全接口,提供一个最小可运行的…...

ComfyUI-Impact-Pack技术深度解析:模块化图像增强与工作流自动化

ComfyUI-Impact-Pack技术深度解析:模块化图像增强与工作流自动化 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址…...

Docker容器化入门:从核心概念到实战部署全解析

1. 从零到一:理解容器化与Docker的核心价值如果你是一名开发者,最近几年肯定没少听到“Docker”这个词。它就像一阵技术旋风,席卷了从个人项目到企业级部署的每一个角落。一开始,你可能会觉得困惑:这到底是个什么玩意儿…...

观察不同模型在 Taotoken 平台上的实际调用响应速度

观察不同模型在 Taotoken 平台上的实际调用响应速度 1. 测试环境与模型选择 在 Taotoken 模型广场中,我们选择了四款主流模型进行测试:claude-sonnet-4-6、claude-haiku-4-8、claude-opus-4-9 和 gpt-4-turbo-preview。测试环境为华东地区的云服务器&a…...