[原創(chuàng)文章歡迎轉(zhuǎn)載,但請保留作者信息]
Justin 于 2010-05-14
本課大師要(大概地)講講模板元編程(Template Metaprogramming, TMP)。
TMP的生命很短,只活在程序編譯期間,最終代碼生成后,模板元編程的使命就完成了。
大師說TMP有兩個重要的作用,由于它是在程序編譯期間運行的,于是:
- 模板元編程使得一些很難或是不可能完成的任務變得很簡單。
- 它可以把程序運行期的一些工作轉(zhuǎn)移到程序的編譯期。
第一個作用說了等于沒說@#¥%,我還沒領悟出來。
第二個左右倒是比較容易理解的,好處也很多:把運行期的工作轉(zhuǎn)移到編譯期,程序運行時的錯誤就可以在編譯期跑出來得到糾正;最終代碼也會變小,運行時間變短,需要的內(nèi)存也會變少,等等。當然,代價就是編譯時間會變長。
由于C++本身并沒有提供可以直接進行模板元編程的機制,所以需要用一些旁門左道來實現(xiàn)TMP。下面來回顧一下上課的內(nèi)容:
程序的元素之一就是判斷分支,一般的語言里會有if-then-else之類的工具可以使用,在C++的模板元編程中,就沒有那么直觀了。我們需要用到模板+重載(是不是想到了traits?)。
例子直接看上一課的筆記就行了:要不要吃面前的食物呢?如果是芝士堡我就吃,如果是芥末我就不吃。這個判斷的過程在編譯期就已經(jīng)完成了,到了程序運行的時候就省去了這一步。
程序中的另外一個要素就是循環(huán),用for/while實現(xiàn)循環(huán)已經(jīng)是條件反射了,不過在C++模板元編程的世界,沒有現(xiàn)成的for/while可以用。我們可以用的是函數(shù)的嵌套來實現(xiàn)TMP中的循環(huán)。(例子我舉不出比書上更好的,就去看書里的吧@#¥%)
當然,不要以為讀了第48章就可以號稱懂模板元編程了。大師這一課的題目是“要知道模板元編程這么一回事”(Be aware of template metaprogramming)。是否真正掌握到這門左道,還是要看后面?zhèn)€人的造化了……