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

04|Concepts背景:C++泛型编程之殇

你好,我是卢誉声。
谈到编程范式,C++ 自诞生之初就自诩为一种“多范式”语言,而泛型编程,作为一种重要的编程范式,是 C++ 诞生时就支持的一种核心特性。
也许你觉得自己离泛型很远,平时也没有在自己的库或者应用中,使用泛型编程作为模块接口或对外接口,其实不是,我们平时用的 C++ 标准库 STL,甚至最常使用的 std::string,都是以泛型编程作为理念设计并实现的。
那泛型编程到底是什么?C++ 如何支持泛型能力,又存在哪些问题?这是我们今天要解决的问题。学完你就会明白,为何 Concepts 会是 C++ 泛型编程中兼具颠覆性与实用性的一种新特性。
课程配套代码,点击这里即可获取。

模板:C++ 泛型编程的基石

长期以来,软件重用一直都是软件工程追求的目标,而泛型编程为软件重用创造了可能性。
所谓泛型编程,指的是通过组件的灵活组合来实现软件,而这些组件通过对定义做出最小“假设”来实现最大灵活性。在讨论泛型编程问题的时候,我们需要区分弱类型语言和强类型语言。
对于脚本语言,如 Perl、PHP、Python、JavaScript 或 Ruby 都属于弱类型语言,对它们来说,其变量本身并不区分类型,所有类型都是在运行时确定的,因此泛型能力被推迟到了运行时。这是一种语言设计的技巧,把这些复杂性交给运行时再决定。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

C++泛型编程是一种重要的编程范式,通过模板实现了软件重用的可能性。本文深入浅出地介绍了C++中泛型编程的基石——模板,包括模板参数、模板实例化、模板参数推导、显式实例化等概念。同时还介绍了模板的特化与偏特化,以及C++14之后对非类型模板参数的特化支持。文章还探讨了不定模板参数的能力,以及模板编程的优势与挑战。泛型编程因C++中的标准模板库而发展壮大,具有强大的泛化能力和表达能力,以及性能更好的优势。然而,C++模板也存在一些问题,包括类型约束晦涩难懂、生成的代码急速膨胀、ABI兼容性糟糕等。尽管C++提供了一套type_traits库来帮助开发者执行各种编译时元数据判定、类型诊断等操作,但编写过程仍然复杂,代码晦涩难懂。此外,模板还存在着生成大量冗余代码和ABI层面严重的兼容性问题。文章对C++泛型编程的优势和挑战进行了全面的阐述,对于想要深入了解C++泛型编程的读者具有很高的参考价值。文章还探讨了模板编程的优势与挑战,包括缺乏语言内置支持的模板参数约束能力、报错信息难以理解、代码生成急剧膨胀、以及ABI兼容性导致难以在接口中使用模板类型。文章提出了Concepts的重要性,并展望了Concepts对泛型编程世界和模板元编程的深远影响。

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

全部留言(3)

  • 最新
  • 精选
  • peter
    请教老师两个问题: Q1:函数名称后面的尖括号是什么意思? 函数定义如下: template <size_t Size, class T, typename U> void fillContainer(T& collection, U value) { 定义中,fillContainer后面没有尖括号<> 调用函数: fillContainer<10, std::deque<int32_t>, int32_t> 调用时,后面加的尖括号<>是什么意思? Q2:不定模板参数的递归怎么终止? 不定模板参数定义如下: double sum(T value, Targs... Fargs) { return static_cast<double>(value) + sum(Fargs...);} 这个定义,似乎是递归,但怎么终止递归?看起来是无穷递归。

    作者回复: Q1:函数调用后的尖括号是指明模板函数模板参数的具体类型或者值,因为有些内容编译器是无法通过调用的参数推测出来的,我们使用模板的方式即如此 Q2:这个终止条件是当最后只有一个参数,Fargs为空列表时,会调用无参版本的sum函数返回0.0,然后返回value + 0.0。。。这样就会终止。

    2023-01-23归属地:北京
    1
  • Geek_a343c9
    老师,Python应该是强类型语言吧?

    作者回复: 这是一个非常好的问题! 我们在这里的上下文讨论时,更多的是要在编译器确定静态类型的“强类型”。但对于Python来说确实有一些讨论,主要是Python有点介于中间态。它运行时还有一些运行时检查,其“强类型”是在运行时确定的。

    2023-05-03归属地:陕西
  • Geek_QiDian
    请问老师,Concepts 能将以上四个问题都解决了吗?

    作者回复: Concepts可以解决1和4,解决2和3不是其目标。

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