[原创文章欢迎转载,但请保留作者信息]
Justin 于 2010-05-14
本课大师要(大概地)讲讲模板元编程(Template Metaprogramming, TMP)。
TMP的生命很短,只活在程序编译期间,最终代码生成后,模板元编程的使命就完成了。
大师说TMP有两个重要的作用,由于它是在程序编译期间运行的,于是:
- 模板元编程使得一些很难或是不可能完成的任务变得很简单。
- 它可以把程序运行期的一些工作转移到程序的编译期。
第一个作用说了等于没说@#¥%,我还没领悟出来。
第二个左右倒是比较容易理解的,好处也很多:把运行期的工作转移到编译期,程序运行时的错误就可以在编译期跑出来得到纠正;最终代码也会变小,运行时间变短,需要的内存也会变少,等等。当然,代价就是编译时间会变长。
由于C++本身并没有提供可以直接进行模板元编程的机制,所以需要用一些旁门左道来实现TMP。下面来回顾一下上课的内容:
程序的元素之一就是判断分支,一般的语言里会有if-then-else之类的工具可以使用,在C++的模板元编程中,就没有那么直观了。我们需要用到模板+重载(是不是想到了traits?)。
例子直接看上一课的笔记就行了:要不要吃面前的食物呢?如果是芝士堡我就吃,如果是芥末我就不吃。这个判断的过程在编译期就已经完成了,到了程序运行的时候就省去了这一步。
程序中的另外一个要素就是循环,用for/while实现循环已经是条件反射了,不过在C++模板元编程的世界,没有现成的for/while可以用。我们可以用的是函数的嵌套来实现TMP中的循环。(例子我举不出比书上更好的,就去看书里的吧@#¥%)
当然,不要以为读了第48章就可以号称懂模板元编程了。大师这一课的题目是“要知道模板元编程这么一回事”(Be aware of template metaprogramming)。是否真正掌握到这门左道,还是要看后面个人的造化了……