95年大四的时候,开始接触C++。工作后算是比较系统全面地学习了C 语言,不过也仅仅是面向对象部分,那个时候以为这些就是C++的全部,对着23种设计模式顶礼膜拜。唯一的收获就是狂啃了MFC的四大天王,终于打通了MFC的任督二脉。
后来转战C#,丰富的界面库,简化的开发流程,以为找到了至爱,“C++远远没有它方便”。不过对于C#的泛型总是感觉别扭,用起来限制很多,“看来没有十全十美的”。前几年换了工作,重新回到了C++的阵营。刚开始我颇为遗憾,用了十多年,真的不想失去C#的优雅。但是很快就发现C 早已是脱胎换骨了,特别是模板技术,完全符合我对泛型编程的想象,而且超越很多,“太酷了!”
这几年我边工作边学习C++的新特性,从C++11到C++20,一路走来,惊喜不断。“C++是一门完美的语言,特别是模板,无与伦比!”想想我差一点就错过,真是有点后怕啊。
C++模板博大精深,它高效无比,但又异常锋利,稍有不慎就会鲜血淋漓。调试C++的模板代码绝对是个噩梦,不过它特有的迷人气质又让我欲罢不能。
我想把自己的学习过程记录下来,主要是方便自己整理。水平有限,文字粗浅,希望对你能有所帮助。如果文中有错误,欢迎留言,一起学习,一起进步。
先说说为什么需要模板吧。
我想最初的想法也许只是出于参数类型化,减少重复代码。比如说实现某个通用算法,针对不同的数据类型,其中的绝大多数代码是相同的,只有少部分针对特定数据类型的处理不一样。你的选择可能不外乎有三个:
1. 针对不同的数据类型,你不停地复制粘贴,然后修改那些不一样的地方。
2. 求助于void*或者object这样的基类。
3. 定义宏,使用预处理。
但上面三种方法的缺点不言而喻:你在不停地重复发明轮子,如果后来有修改,你不得不逐一修改每个轮子;使用void*或基类,你的代码结构会相当复杂,你要仔细处理类型的差别,或者使用繁杂的继承体系;宏只是简单的文本替换,没有类型和其他安全性的检查。使用模板会是最好的选择。
不过模板的用法已经大大超越了最初的设计,随着各种使用方式和技术的发现或挖掘,泛型编程范式已经非常成熟,STL就是一个非常好的样例。它并非一个传统的OO库,你看不到多少继承(所以千万不要用Java或C#的学习经验来学习STL),充斥其中的是泛型设计的核心,概念。
好了,先到这里,下次正式开始学习,套用20年前计算机类书籍的一个非常流行的书名,“XXX从入门到精通”,前面是对,咱们打算入门,精通可万万不敢说。
[ 本帖最后由 upup22you 于 2024-6-15 19:59(GMT+8) 编辑 ]
搜索更多相关主题的帖子:
一代综师