模板元编程(Template Metaprogramming)从来都是C++程序设计中被多数人视为畏途的领域。类型设计本就是具备丰富经验的工程师才能操刀的活计,C++语言之所以强大,一个重要的原因就是它具有强类型(strongly typed)特性。有了这样的特性以后,开发人员就能在编译期实施种类繁多的静态检查,从而把很多潜在的软件缺陷尽早地暴露,避免它们到链接期甚至运行期才兴风作浪。但反过来,类型设计中的任何缺陷都会把原罪带给该类型的所有对象,甚至该类型各级派生类型的所有对象。而且,软件一旦上线,一旦分发到用户手里,再要修改,谈何容易!所以,类型设计,尤其是大型软件中的基础类型设计,对工程师的要求已经很有挑战。而模板元编程,则在此基础之上更进一阶。如果说负责类型设计的工程师,他们的产品是对象和对象的运算;那么,负责模板元编程的工程师,他们的产品就是类型和类型的运算,即前者的上游。对于绝大多数的C++开发人员来说,能够自如地使用对象已非易事。而能够不仅设计类型,还要根据需要自如地产生和剪裁所需要的类型,而且还得把这种能力作为一种服务提供出来,让其他工程师使用,这里面的功夫之深可想而知。所以,虽然关于C++语言的图书汗牛充栋,但是讲解模板元编程的却是寥若晨星。即便是以此为主题的图书,也基本上是就事论事,这不免让读者产生疑问:模板元编程确实厉害,但是这和我的日常工作有何关系?这难道不应该是C++标准委员会中那些头发稀少的专家们的玩具吗?
看到这本《C++模板元编程实战》书名的最后二字,我眼前一亮。模板元编程、深度学习框架,还是实战,这几个关键词,已经有了致命的吸引力。
作为一名C++资深爱好者,我可以清楚地感觉本书的质量和份量。从第一行代码开始,本书就是采用现代C++标准。可以说,作者是直接从现代C++开始学习和掌握C++的新生代工程师,身上绝少来自“C++远古时代”的陈腐气息,至今还在C++社区中纠缠不清的很多语法问题,在本书中根本就不是问题——C++就是现代C++,当然应该使用constexpr,当然应该使用auto,当然应该使用别名声明。
本书以明快、详尽的风格,集中演示了在现代C++中进行模板元编程的必要技巧。现代C++为工程师提供了很多必要的工具,使得模板元编程能够以更直接和清晰的方式来表达生成类型的算法,本书的前几章给出了如何高效利用这些工具的指南。但是本书远未停留在那里,因为全书的重点在于实战二字。
作者通过构造一个功能全面、强大的MetaNN深度学习框架,展示了模板元编程是如何从类型层面进行深度学习涉及的具体数据和操作的设计,这种设计是分层递进的:先引入基本的可定制的数据结构模板和策略,再设计以这些数据模板为基础的算法模板,尔后在数据和算法之上,构建深度学习的业务逻辑。这一部分内容虽然篇幅较大,但是读起来不累,因为讲解的每个知识点都是已经系统讲解过的语言要点的呼应和深化。非常可贵的是,这些内容切切实实地给到读者这样的信息:模板元编程在实战中是确实有用的,而且很多时候是非用不可的。本书每一章后面还跟着若干练习,启发读者的进一步思考。有的习题会让读者从多个侧面考虑如何进一步利用模板元编程的高阶用法,从另外的维度拓展深度学习业务,还有些习题会提示读者某些语言特性可以应用的其他行业领域。
在现代C++和深度学习都炙手可热的今天,有这样一本由真正的一线专家撰写的精良作品,对读者来说是一种幸福。本书对于读者的预备知识要求并不多,因为书中介绍得足够详尽。只要有一颗愿意学习的心,就能够很好地同时掌握现代C++和深度学习这两门能够为你带来巨大技术优势的学问。
谨向广大读者隆重推荐这本《C++模板元编程实战》!
高博,《C++覆辙录》、《Effective Modern C++中文版》译者
2018年10月,新加坡,Tanjong Pagar