现代 C++20 实战高手课
卢誉声
Autodesk 首席工程师
3781 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
现代 C++20 实战高手课
15
15
1.0x
00:00/00:00
登录|注册

06|Concepts实战:写个向量计算模板库

你好,我是卢誉声。
Concept 之于 C++ 泛型编程,正如 class 之于 C++ 面向对象。在传统的 C++ 面向对象编程中,开发者在写代码之前,要思考好如何设计“类”,同样地,在 C++20 及其后续演进标准之后,我们编写基于模板技术的泛型代码时,必须先思考如何设计好“concept”。
具体如何设计呢?今天我们就来实战体验一下,使用 C++ 模板,编写一个简单的向量计算模板库。
在开发过程中,我们会大量使用 Concepts 和约束等 C++20 以及后续演进标准中的特性,重点展示如何基于模板设计与开发接口(计算上如何通过 SIMD 等指令进行性能优化不是关注的重心)。
完成整个代码实现后,我们会基于今天的开发体验,对 Concepts 进行归纳总结,进一步深入理解(课程配套代码,点击这里即可获取)。
好,话不多说,我们直接开始。

模块组织方式

对于向量计算模板库这样一个项目,我们首先要考虑的就是如何组织代码。
刚刚学的 C++ Modules 正好可以派上用场,作为工程的模块组织方式。后面是项目的具体结构。
实现向量计算库的接口时,我们会部分模仿 Python 著名的函数库 NumPy。因此,向量库的模块命名为 numcpp,namespace 也会使用 numcpp。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了利用C++20的特性设计和开发向量计算模板库。通过介绍模块组织方式和接口设计,重点讲解了利用Concepts约束设计的模板,展示了如何在C++20及其后续演进标准中应用这些特性。文章通过对核心Concepts的定义和工程代码中合适地使用Concepts的演示,帮助读者快速了解如何利用C++模板技术和Concepts设计和开发一个向量计算模板库。此外,还介绍了视图模块和计算模块的具体实现,展示了模块化设计的优势。整体而言,本文为读者提供了实际操作的示例,帮助他们更好地理解C++20及其后续演进标准,为C++开发者提供了有益的技术参考。文章强调了Concepts的重要性,以及它们在泛型编程中的应用,为读者提供了对现代C++特性的深入理解和应用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++20 实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 黄骏
    内容太干了。哈哈。 nits:concepts.cpp的line 38应该是IteratorMemberFunction(&T::end)吧?

    作者回复: 是的,应该把begin换成end。 已进行修正。 🥰

    2023-01-29归属地:湖北
    1
  • 常振华
    我觉得concepts确实比modules有用多了。。。前者能改变编程思想,后者在我看来只是换汤不换药的语法糖,反而让语法看起来更复杂

    作者回复: 就目前来说,编译器对 modules 的支持还非常非常初级,以至于很多标准都没有能实现。但是总的来说,modules 作为诸多现代语言的特性,在C++中也能彻底解决符号隔离问题,而且对产品分发来说也大有益处。 当然,这都需要建立在编译器对 modules 的完善支持的基础上,就目前来说,还不行。需要等待C++23、C++26的推出,以及主流编译器跟进的速度,如clang、gcc和 VC。

    2023-09-12归属地:广东
  • !null
    定义 creation 模块时用到的 fillContainerBuffer、makeContainerShape 和 ContainerValueTypeHelper 这些约束表达式,就利用了 concept 的“原子约束”特性选择不同的模版版本,实现了泛型编程中的“多态”特性。 没看懂哪里体现了泛型编程的多态

    作者回复: 多态也就是针对不同的输入类型提供统一的接口。 Concepts正给我们提供了这种能力,而且更细粒度地为不同的类型提供不同的实现。

    2023-08-15归属地:北京
  • Geek_7c0961
    concepts 这个feature太强了, 让我想起了rust中的traits 和 traits objects.

    作者回复: Concepts的确是非常重要的feature,让C++编译时静态化编码整体提升了一个档次。现代C++演进有一种“Rust化”的趋势,当然了,C++还是有着独特的气质,而且对向前兼容性方面几乎是无敌的。

    2023-01-31归属地:美国
  • Geek_e04349
    感觉 SliceItem 的 getValidValue 使用 optional 返回会更符合其语义

    作者回复: 这里的确是可以使用std::optional。

    2023-01-27归属地:云南
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部