news 2026/4/18 13:06:00

【20天学C++】Day 18: C++14/17新特性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【20天学C++】Day 18: C++14/17新特性

【20天学C++】Day 18: C++14/17新特性

📅 学习时间:3-4小时
🎯 学习目标:掌握C++14/17实用新特性
💡 难度:★★★☆☆


1. C++14新特性

1.1 泛型Lambda

#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intmain(){// C++11: 必须指定类型autoadd11=[](inta,intb){returna+b;};// C++14: 泛型Lambdaautoadd14=[](autoa,autob){returna+b;};cout<<add14(1,2)<<endl;// intcout<<add14(1.5,2.5)<<endl;// doublecout<<add14(string("Hello, "),string("World"))<<endl;// string// 泛型排序vector<int>v={5,2,8,1,9};sort(v.begin(),v.end(),[](autoa,autob){returna>b;});return0;}

1.2 返回类型推导

#include<iostream>usingnamespacestd;// C++14: 自动推导返回类型automultiply(inta,intb){returna*b;}// 递归时需要至少一个return在递归之前autofactorial(intn){if(n<=1)return1;returnn*factorial(n-1);}intmain(){cout<<multiply(3,4)<<endl;cout<<factorial(5)<<endl;return0;}

1.3 变量模板

#include<iostream>usingnamespacestd;// 变量模板template<typenameT>constexprT pi=T(3.1415926535897932385);intmain(){cout<<pi<float><<endl;cout<<pi<double><<endl;return0;}

1.4 make_unique

#include<iostream>#include<memory>usingnamespacestd;intmain(){// C++11: 只有make_sharedautosp=make_shared<int>(10);// C++14: 新增make_uniqueautoup=make_unique<int>(20);autoarr=make_unique<int[]>(5);return0;}

2. C++17新特性

2.1 结构化绑定

#include<iostream>#include<tuple>#include<map>usingnamespacestd;tuple<int,string,double>getStudent(){return{1001,"张三",95.5};}intmain(){// 结构化绑定元组auto[id,name,score]=getStudent();cout<<id<<", "<<name<<", "<<score<<endl;// 结构化绑定数组intarr[]={1,2,3};auto[a,b,c]=arr;// 结构化绑定结构体structPoint{intx,y;};Point p{10,20};auto[x,y]=p;// 结构化绑定mapmap<string,int>m={{"a",1},{"b",2}};for(constauto&[key,value]:m){cout<<key<<": "<<value<<endl;}return0;}

2.2 if/switch初始化

#include<iostream>#include<map>usingnamespacestd;intmain(){map<string,int>m={{"a",1},{"b",2}};// C++17: if语句中初始化if(autoit=m.find("a");it!=m.end()){cout<<"找到: "<<it->second<<endl;}else{cout<<"未找到"<<endl;}// it在这里已经失效// switch中初始化switch(intn=2;n){case1:cout<<"一"<<endl;break;case2:cout<<"二"<<endl;break;default:break;}return0;}

2.3 std::optional

#include<iostream>#include<optional>#include<string>usingnamespacestd;optional<string>findName(intid){if(id==1)return"张三";if(id==2)return"李四";returnnullopt;// 表示没有值}intmain(){autoname1=findName(1);if(name1.has_value()){cout<<"找到: "<<name1.value()<<endl;}// 或者if(name1){cout<<"找到: "<<*name1<<endl;}autoname3=findName(3);cout<<name3.value_or("未知")<<endl;// 默认值return0;}

2.4 std::variant

#include<iostream>#include<variant>#include<string>usingnamespacestd;intmain(){// 类型安全的unionvariant<int,double,string>v;v=10;cout<<get<int>(v)<<endl;v=3.14;cout<<get<double>(v)<<endl;v="hello";cout<<get<string>(v)<<endl;// 检查当前类型if(holds_alternative<string>(v)){cout<<"是string"<<endl;}// 访问者模式visit([](auto&&arg){cout<<"值: "<<arg<<endl;},v);return0;}

2.5 std::any

#include<iostream>#include<any>#include<string>usingnamespacestd;intmain(){any a=10;cout<<any_cast<int>(a)<<endl;a=3.14;cout<<any_cast<double>(a)<<endl;a=string("hello");cout<<any_cast<string>(a)<<endl;// 检查类型if(a.type()==typeid(string)){cout<<"是string"<<endl;}// 错误转换会抛异常try{cout<<any_cast<int>(a)<<endl;}catch(constbad_any_cast&e){cout<<"类型错误: "<<e.what()<<endl;}return0;}

2.6 std::string_view

#include<iostream>#include<string>#include<string_view>usingnamespacestd;// string_view不拥有字符串,只是视图voidprint(string_view sv){cout<<sv<<endl;}intmain(){string s="Hello World";constchar*cs="Hello C++";// 都可以传入print(s);print(cs);print("Hello Literal");// 子串不需要分配内存string_view sv=s;string_view sub=sv.substr(0,5);// 不分配新内存cout<<sub<<endl;return0;}

2.7 折叠表达式

#include<iostream>usingnamespacestd;// 可变参数模板 + 折叠表达式template<typename...Args>autosum(Args...args){return(args+...);// 右折叠}template<typename...Args>voidprintAll(Args...args){(cout<<...<<args)<<endl;// 左折叠}intmain(){cout<<sum(1,2,3,4,5)<<endl;// 15cout<<sum(1.5,2.5,3.0)<<endl;// 7.0printAll("Hello"," ","World","!");// Hello World!return0;}

2.8 内联变量

// 头文件中structConfig{staticinlineintvalue=42;// C++17: 可以在类内初始化};inlineintglobalValue=100;// 内联全局变量,多个编译单元只有一份

2.9 if constexpr

#include<iostream>#include<type_traits>usingnamespacestd;template<typenameT>autogetValue(T t){ifconstexpr(is_integral_v<T>){returnt*2;}elseifconstexpr(is_floating_point_v<T>){returnt*0.5;}else{returnt;}}intmain(){cout<<getValue(10)<<endl;// 20cout<<getValue(3.14)<<endl;// 1.57cout<<getValue("hello")<<endl;// helloreturn0;}

3. 小结

[C++14] 1. 泛型Lambda: [](auto a) 2. 返回类型推导 3. make_unique 4. 变量模板 [C++17] 5. 结构化绑定: auto [a, b] = ... 6. if/switch初始化 7. std::optional 8. std::variant 9. std::any 10. std::string_view 11. 折叠表达式 12. if constexpr 13. 内联变量

下一篇预告:Day 19 - 多线程编程


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:39:13

亲测好用10个降AIGC工具推荐 千笔·专业降AI率智能体更高效

AI降重工具&#xff1a;高效应对论文查重难题 随着人工智能技术的不断发展&#xff0c;越来越多的学生在撰写论文时会使用AI辅助写作工具。然而&#xff0c;这种便捷性也带来了新的挑战——如何有效降低AIGC率和查重率&#xff0c;同时保持文章的语义通顺与逻辑严谨&#xff1f…

作者头像 李华
网站建设 2026/4/18 0:48:44

什么是智能场馆预订系统?带活动管理与积分营销的源码介绍

温馨提示&#xff1a;文末有资源获取方式 在移动互联网时代&#xff0c;用户入口分散&#xff0c;管理需求复杂&#xff0c;场馆运营者需要的是一个全面、集成、能打通线上线下的一体化解决方案。下面深入介绍一款以多端适配为核心优势的场馆预订系统源码&#xff0c;解析其如何…

作者头像 李华
网站建设 2026/4/18 11:01:32

AI开发-python-langchain框架(1-8-2 缓存机制——验证缓存的效果)

在AI应用中&#xff0c;缓存机制的经济价值不仅节省Token成本&#xff0c;还能消除用户等待焦虑、提升系统吞吐量、保障服务稳定性——这才是企业级应用的真正痛点。  当用户提出一个常见问题时&#xff0c;首次调用大模型需要经历网络传输、排队等待、模型推理等完整链路&am…

作者头像 李华
网站建设 2026/4/18 12:58:49

2026高职大数据管理与应用专业应届生学数据分析的技术价值分析

行业需求与就业前景数据分析在各行业的渗透率持续上升&#xff0c;金融、电商、医疗等领域对数据分析人才需求旺盛。2026年预计数据分析岗位缺口将进一步扩大&#xff0c;高职专业学生掌握技能后可覆盖初级分析师、数据运营等岗位。企业招聘数据显示&#xff0c;大数据管理与应…

作者头像 李华
网站建设 2026/4/17 22:12:28

Java语言提供了八种基本类型。六种数字类型

Java 语言提供了 八种基本数据类型&#xff08;primitive types&#xff09;&#xff0c;它们是 Java 中最基础、最直接的数值/逻辑表示方式&#xff0c;不依赖于对象&#xff08;不像包装类 Integer、Double 等&#xff09;。 官方标准表述&#xff08;来自 Oracle Java 文档…

作者头像 李华