书籍作者:罗能 | ISBN:9787111708223 |
书籍语言:简体中文 | 连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 | 下载次数:5226 |
创建日期:2023-04-10 | 发布日期:2023-04-10 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
C++20高级编程主要讲解C++库、框架开发中的高级编程技术,以及*新的C++20标准特性。全书共10章,分别为:类型与对象、编译时多态、概念约束、元编程介绍、模板元编程、constexpr元编程、Ranges标准库、协程、模块、综合运用。其中C++20的四大特性独立成章,一些小的特性则贯穿于全书,其他章节则探讨了面向对象、元编程、函数式编程、并发编程等话题。
C++20高级编程针对以上新特性准备了丰富的代码样例,并随书附赠全部案例源码。相信通过这些代码,读者很容易掌握这些新特性。作为一本讲解C++高级编程的书,本书还探讨了很多元编程话题,这是作为库开发必不可少的技能,它们也将随着C++的演进而不断演进,大大提升库开发者的编程体验,尤其是近年来C++的标准提案经历了从模板元编程向constexpr元编程转换的过程。
C++20高级编程适合中高级C++程序员、架构师、框架开发者阅读,阅读前*好能够掌握一些现代C++的知识。对于想要系统性学习C++20并进阶C++技能的读者,一定不要错过本书。
罗能,华为海思高级工程师,2015年获得安徽省ACM编程竞赛全省夺冠,2018年获得华为无线编程竞赛冠军。知乎《魅力C++》专栏作者,累计收获6000+赞,7000+收藏,阅读量超100万。
熟悉面向对象编程、函数式编程,经常活跃于开源社区,为开源社区贡献过多项代码,GitHub累计收获1300+星。
◆ 前言:◆
C++语言至今拥有40多年的历史,目前最新的C++标准已经发展到了C++20,它给我们带来了相当重要的四大特性:概念约束、ranges(范围)标准库、协程以及模块。
概念约束是一个编译期谓词,它根据程序员定义的接口规范对类型、常量等进行编译时检查,以便在泛型编程中为使用者提供更好的可读性与错误信息。
ranges标准库对现有的标准库进行了补充,它以函数式编程范式进行编程,将计算任务分解为一系列灵活的原子操作,使得代码的正确性更容易推理。
协程是一种可挂起、可恢复的通用函数,它的切换开销是纳秒级的,相对其他方案而言占用的资源极低,并且可以非侵入式地为已有库扩展协程接口,它常常用于并发编程、生成器、流处理、异常处理等。
模块特性解决了传统的头文件编译模型的痛点:依赖顺序导致头文件难以组合、重复解析、符号覆盖等问题,从语言层面为程序员提供了模块化的手段。
本书针对以上新特性准备了丰富的代码样例,相信读者通过这些代码很容易掌握这些特性。作为一本讲解C++高级编程的书,本书还探讨了很多元编程话题,这是作为库开发必不可少的技能,它们也将随着C++的演进而不断演进,大大提升了库开发者的编程体验,尤其是近年来C++的标准提案经历了从模板元编程向constexpr元编程的转换过程。
纵观C++的演进历程可以发现,每一次演进提供的特性大多数和编译时相关,因为它的特点是零成本抽象,允许程序员表达抽象的概念而无须忍受不必要的运行时开销。而一些运行时特性相当少,在面向对象的虚函数特性之后再无运行时特性,或者它们通常以库的形式提供,例如从C++17起标准库引入的variant类型,它通过元编程技术生成虚函数表。
C++对语言特性与库特性区分得非常清楚,它希望程序员能够在不引入语言机制的情况下实现一些功能,例如其他编程语言常常将元组tuple作为内建类型,而在C++中它们以库的方式提供,程序员能够利用现有的语言特性实现这些组件。
如何合理、高效地运用这些知识,它们背后通常蕴含着什么指导思想?那就是组合式思想,将问题分而治之,从而能够应对许多难题。C++语言提供了足够多的抽象机制,允许程序员提出各种假设,并基于这些假设进行灵活组合。
本书话题不局限于C++20,对现代C++中很多重要的特性也会深入探讨,例如右值引用。一些编程原则,面向对象设计模式也会探讨。最后一章将带领读者实现两个库:配置文件反序列库与协程库。它们大量使用C++20提供的特性,并使用元编程的方式构建,以对全书知识进行一个总结。
本书要求读者需要有C++的基础知识,最好能够掌握一些现代C++的知识,考虑到市面上的书籍以及网络上这方面的资料比较丰富,笔者在提及这些知识时会引用相关链接供读者查阅。对于想要系统性学习C++20并进阶C++技能的读者,一定不要错过本书。
本书创作历时一年多,笔者在工作与业余时间不断磨炼C++技能,这期间很多人为我提供了帮助与支持,没有你们本书就不可能问世。
感谢我所在的工作团队为我提供了良好的工作环境,让我能够随心所欲地探索软件上的新技术。其间,袁英杰大师加入了我们团队参与开发,给我带来了很大的启发。
我从他身上学到了很多编程思想,这些思想并不是空谈,而是真真切切能够影响到整个编码过程,并且指导了我的软件开发工作。在与袁英杰大师共事的几个月里,我感受到了大师代码里处处充满组合式思想,泛型、抽象运用得非常优雅,能够充分应对软件开发中的各种变化。
偶然在公司的一次关于软件重构的演讲中,我认识了吴咏炜老师,从那时起,我们便时常交流C++相关话题,在交流过程中我也学习到了很多。吴咏炜老师牺牲个人时间为本书做技术校对,他非常细心,帮我避免了很多技术上以及排版上的错误,并且对一些章节提出了调整建议。
由于C++20刚标准化不久,业界的很多优秀资料都是英文的。在我创作过程中阅读这些资料难免会遇到困难,职愈博(Norman Zhi)给我在一些语法上的理解提供了帮助。他是一位优秀的硬件工程师,有时候我们会讨论很多与Linux、性能、C语言相关的话题,这也为本书提供了一些灵感。
机械工业出版社的李晓波编辑也为本书能够顺利出版提供了帮助。还要感谢读者选择了这本书,期待你能够从中获得启发。最后,感谢我的妻子,正是你的鼓励、付出与陪伴,才让我能够专心完成本书的创作。
罗能
◆ 目录:◆
序
前言
第1章 类型与对象/
1.1类型的作用/
1.2现代C++中对类型处理能力的演进/
1.3值类别(value category)/
1.3.1理解左值与右值/
1.3.2函数形参何时使用何种引用/
1.3.3转发引用与完美转发/
1.4类型推导/
1.4.1auto类型推导/
1.4.2decltype类型推导/
1.4.3decltype(auto)类型推导/
1.4.4std::declval元函数/
1.4.5类模板参数推导(CTAD)/
1.5函数对象/
1.5.1定义函数对象/
1.5.2lambda表达式/
1.5.3函数适配器/
1.6运行时多态/
1.6.1运行时多态手段/
1.6.2subtype多态vsadhoc多态/
1.7调试手段/
1.7.1编译时打印方案/
1.7.2运行时打印方案/
1.7.3使用外部工具/
第2章 编译时多态/
2.1函数重载机制/
2.1.1名称查找/
2.1.2模板函数处理/
2.1.3重载决议/
2.1.4注意事项/
2.1.5再谈SFINAE/
2.2类型特征(Type traits)/
2.2.1Type traits谓词与变量模板/
2.2.2类型变换/
2.2.3辅助类/
2.2.4空基类优化/
2.2.5实现Type traits/
2.2.6类型内省/
2.2.7enable_if元函数/
2.2.8标签分发/
2.2.9if constexpr/
2.2.10void_t元函数/
2.3奇异递归模板/
2.3.1代码复用/
2.3.2静态多态/
2.3.3enable_shared_from_this模板类/
2.4表达式模板/
2.4.1标量延迟计算/
2.4.2向量延迟计算/
2.4.3提高表达力/
2.5注意事项/
第3章 概念约束/
3.1定义概念/
3.2requires表达式/
3.2.1简单要求/
3.2.2类型要求/
3.2.3复合要求/
3.2.4嵌套要求/
3.2.5注意事项/
3.3requires子句/
3.4约束的偏序规则/
3.4.1约束表达式归一化/
3.4.2简单约束的包含关系/
3.4.3一般约束的包含关系/
3.4.4using类型别名与concept表达式别名/
3.5概念标准库/
3.5.1same_as(与某类相同)/
3.5.2derived_from(派生自某类)/
3.5.3convertible_to(可转换为某类)/
3.5.4算术概念/
3.5.5值概念/
3.5.6invocable(可调用的)/
3.6综合运用之扩展transform变换算法/
3.7注意事项/
第4章 元编程介绍/
4.1元编程历史/
4.2模板历史/
4.3constexpr历史/
4.4元编程能力与应用/
4.4.1零成本抽象/
4.4.2值计算/
4.4.3类型计算/
4.4.4编译时多态/
4.4.5类型安全/
4.4.6泛型编程/
4.4.7静态反射/
4.4.8内部领域特定语言EDSL/
第5章 模板元编程/
5.1模板vs宏/
5.1.1泛型函数/
5.1.2泛型容器/
5.2模板类元函数/
5.2.1数值计算/
5.2.2类型计算/
5.3TypeList/
5.3.1基本方法/
5.3.2高阶函数/
5.3.3常用算法/
5.4综合运用/
5.4.1全局最短路径/
5.4.2KV数据表/
5.4.3注意事项/
第6章 constexpr元编程/
6.1constexpr变量/
6.2constinit初始化/
6.3折叠表达式/
6.4constexpr函数/
6.4.1consteval/
6.4.2编译时内存分配/
6.4.3编译时虚函数/
6.4.4is_constant_evaluated/
6.4.5停机问题/
6.4.6检测未定义行为/
6.5非类型模板参数/
6.6constexpr与TypeList/
6.6.1类型、值的包裹类/
6.6.2高阶函数/
6.6.3管道操作符/
6.6.4重构KV数据表/
6.7综合运用之编译时字符串操作/
第7章 Ranges标准库/
7.1range访问操作/
7.1.1ranges::begin/
7.1.2ranges::end/
7.1.3ranges::size/
7.1.4ranges::empty/
7.1.5ranges::data/
7.2range相关概念/
7.2.1range/
7.2.2borrowed_range/
7.2.3sized_range/
7.2.4view/
7.2.5其他概念/
7.3range实用组件/
7.3.1view_interface/
7.3.2subrange/
7.3.3ref_view/
7.4range工厂/
7.4.1empty_view/
7.4.2single_view/
7.4.3iota_view/
7.4.4istream_view/
7.5range适配器/
7.5.1适配器对象/
7.5.2all/
7.5.3filter/
7.5.4transform/
7.5.5take/
7.5.6take_while/
7.5.7drop/
7.5.8drop_while/
7.5.9join/
7.5.10split/
7.5.11common/
7.5.12reverse/
7.5.13elements/
7.6其他改善/
7.6.1迭代器概念/
7.6.2算法接口改善/
7.7综合运用/
7.7.1矩阵乘法/
7.7.2日历程序/
7.7.3注意事项/
第8章 协程/
8.1协程的起源/
8.2协程初探/
8.3函数与协程理论/
8.4揭秘co_await表达式/
8.4.1表达式转换过程/
8.4.2Awaiter对象/
8.4.3标准库中的Awaiter/
8.5揭秘Promise概念/
8.5.1协程句柄/
8.5.2Promise概念/
8.6综合运用/
8.6.1生成器/
8.6.2为已有类型非侵入式扩展协程接口/
8.6.3利用协程机制简化错误处理/
8.6.4注意事项/
第9章 模块/
9.1Hello World模块/
9.2定义一个模块/
9.3模块分区/
9.4私有片段/
9.5模块样板文件/
9.6注意事项/
第10章 综合运用/
10.1配置文件反序列化框架/
10.1.1背景介绍/
10.1.2标准的缺失,静态反射机制/
10.1.3元数据设计/
10.1.4REPEAT宏/
10.1.5结构体遍历/
10.1.6编译时多态/
10.1.7反序列化数据类型/
10.2AsyncIO协程库/
10.2.1背景介绍/
10.2.2性能测试/
10.2.3事件驱动模型/
10.2.4Handle类设计/
10.2.5调度器设计/
10.2.6Task协程设计/
10.2.7实现一些协程/
10.2.8注意事项/
附录/
附录A概念约束历史/
参考文献/