1 第六章 模板實戰
從某種意義上講,模板是位於宏和普通聲明之間的一種構造。
1.1 包含模型
我們可以用幾種方法來組織模板原始碼,其中最常用的就是包含模型。
所謂包含模型,其實可以有三種組織方式:
l 直接在標頭檔中採用內嵌函式的編寫方式來寫模板類和模板函數;(通過我在VS2005上做實驗,目前只支援這種模型)
l 申明和定義分開,但是都寫在標頭檔中;
l 將模板的聲明和定義放在兩個不同的檔案(即.h和.cpp),然後在標頭檔的末尾添加上#include “xxx.cpp”即可。
一般來說,我們推薦使用第二種方式。
如果不需要考慮建立期的時間問題,我們建議盡量使用包含模型來組織模板代碼。
1.2 顯式執行個體化
包含模型能夠確保所有需要的模板都已經執行個體化了。這是因為:當需要進行執行個體化的時候,c++編譯系統會自動產生所對應的執行個體化體。
C++標準還提供了一種手工執行個體化模板的機制:顯示執行個體化指示符。
1.2.1 顯示執行個體化的例子
template void print_typeof<double>(double const&);
顯示執行個體化指示符由關鍵字template和緊接其後的我們所需要執行個體化的實體(可以是類、函數、成員函數等)的聲明組成,而且該聲明是一個已經實參完全替代參數之後的聲明。
對於每個不同的實體,只能顯示執行個體化一次。
1.3 分離模型
就像像定義一般的c++類一樣定義,只是在定義每個成員函數之前加上export關鍵字,不過從目前來看,vs2005還不支援該關鍵字。
所以暫時不用理會。至於書中提到的為分離模型做好準備,觀點很好,但是似乎在vs2005下無法編譯通過。因為我如果吧聲明和定義放在兩個檔案,就會導致編譯錯誤。
1.4 先行編譯標頭檔
先行編譯標頭檔的機制是位於標準之外的,主要依賴於特定產品的實現。
對於具有足夠記憶體的系統,先行編譯標頭檔機制會使得處理速度比編譯大多數單個標準標頭檔快很多。
管理標頭檔的一個可取的方法是:對先行編譯檔案進行分層,即根據標頭檔的使用頻率和穩定性來進行分層。
我們應該對那些屬於更穩定層級的標頭檔進行先行編譯,然後在不太穩定的標頭檔中重用這個穩定的先行編譯標頭檔,從而提高整個編譯效率。
1.5 調試模板
本節對我來說沒什麼用,只是其中介紹的tracer還挺有意思,有興趣可以看看,也可以用來調試一些自己寫的演算法。
1.6 本章後記
包含模型是實際採用的方法,現在的c++編譯器實現採用的大多就是這種方法。