当1994年,Erwin Unruh在C++标准委员会上演示了通过C++模板在编译期计算素数的程序后,C++模板元编程的能力就已经被人们认识到了。但是由于函数式编程和广大程序员所熟悉的命令式编程存在着较大差异,以及C++标准和C++编译器对模板元编程支持上的很多漏洞,导致了模板元编程的代码在一般程序员的眼中十分的晦涩难懂。所以随后的很多年,模板元编程只被掌握在少数C++程序员手中,而在更大多数人眼中则更似是一种奇技淫巧。
虽然如此,由于人们对计算机程序的表达力和性能的同时追求,C++模板元编程的使用还是渗透在非常多优秀的框架和程序库中。往往你看一个漂亮的C++库或者框架的源码,都会惊奇的发现,为其漂亮点睛、化腐朽为神奇的那段核心代码中,都离不开模板元编程的身影。因为模板元编程的编译期计算和代码生成的能力,可以让你的程序更加的灵活、简洁、安全并且高效。
正是如此,C++标准库STL中就使用了非常多的模板元编程技巧,而且也给程序员提供了很多好用的模板元编程工具,例如我们之前提到的丰富的type_traits
工具集。而boost中的mpl,则是一个完全为模板元编程打造的库。它实现了完备的编译期数据结构和算法,以及各种常用的元编程模式。Mpl甚至还实现了一套编译期的lambda架构,用于在模板元编程中使用编译期的lambda表达式。但是遗憾的是,mpl的实现过程中同时大量的使用了boost的预处理元编程技术,导致代码非常的晦涩难懂,对想通过阅读mpl源码来学习模板元编程的同学增加了非常大的噪音干扰。
自从C++11标准发布后,C++语言和主流编译器对模板以及编译期计算的支持已经逐渐完备,同时标准修复了不少漏洞,使得模板元编程的代码可以书写的更加自然和简单。为此,我基于C++11标准实现了一套针对C++模板元编程的基础库TLP。这个库的主要目的是帮助大家更容易地学习C++模板元编程,正因如此我在写的过程中不断地追求代码的表达力和清晰性。为了能够通过测试用例来展示库组件的用法,我专门编写了一个面向模板元编程进行编译期测试的xUnit测试框架,TLP库中的所有组件都经过了该测试框架的测试。
虽然你的软件可以直接依赖整个TLP库,但是对于C++这么一门让程序员追求极致的语言,学会TLP中模板元编程的设计技巧,然后按需所取地去解决自己的问题显得更为实际。而且模板元编程的特点决定了它不应该出现在你软件中的每一处,正常情况下只是在最核心地方去解决一些关键的问题。所以你应该把TLP库当做一个素材库,学习并掌握里面每个组件和算法的设计,学会针对你的具体问题采用类似的设计技巧去解决问题。为了让大家能够更好地学习TLP库中的代码设计,我写了这篇手册,介绍了模板元编程的基础知识以及TLP库中关键组件和算法的实现技巧,最后还列举了模板元编程的一些具体应用。在这个手册中,我同时提到了很多对编程语言和软件设计的理解,希望也会对大家有用。
正如我最开始所说,模板元编程是中级C++程序员迈向高级的必经之路,希望本文以及TLP库中的代码对大家更好地学习模板元编程起到帮助,使得我们可以在C++中以一种更有效、更酷的方式去解决问题。
** 作者: MagicBowen**
** Email:e.bowen.wang@icloud.com **
** 转载请注明作者信息,谢谢!**