C Templates 模板實戰

2021-05-25 18:58:33 字數 1252 閱讀 1787

包含模型:

把模板的定義包含在宣告模板的標頭檔案裡面,即讓定義和宣告都位於同乙個標頭檔案中。

如果不需要考慮建立期的時間問題,建議盡量使用包含模型來組織模板**。

非內聯函式模板在呼叫的位置並不會被擴充套件,而是當它們基於某種型別進行例項化之後,才產生乙份新的(基於該型別的)函式拷貝。

顯式例項化:

顯式例項化指示符由關鍵字template和緊接其後的我們所需要例項化的實體(可以是類、函式、成員函式等)的宣告組成,而且,該宣告是乙個已經用實參完全替換引數之後的宣告:

template void print_typeof(double const&);

對於每個不同實體,在乙個程式中最多只能有乙個顯式例項化體,在同乙個程式中每個指示符都只能出現一次。

人工例項化有乙個顯著的缺點:必須仔細跟蹤每個需要例項化的實體。

分離模式:

在乙個檔案裡面定義模板,並在模板的定義和宣告的前面加上關鍵字export:

export

template

void print_typeof(t const&);

在乙個預處理檔案內部,只需要在第乙個宣告前面標記export關鍵字就可以了,後面的重新宣告(也包括定義)會隱式地保留這個export特性。

內聯函式不可匯出。

export關鍵字不能和inline關鍵字一起使用;如果用於模板的話,export要位於關鍵字template的前面,下面是兩個錯誤的例子:

template

class invalid

export template

inline void invalid::wrong(t)

分離模型的限制:

1.很少編譯器對其支援

2.例項化過程需要處理兩個位置:模板被例項化的位置和模板定義出現的位置,並且系統為這兩個位置建立了一些看不見的耦合。

3.被匯出的模板可能會導致出人意料的語義。

預編譯標頭檔案:

可以使用某種方式來組織**,讓多個檔案中前面的**都是相同的,並讓編譯器先編譯這些相同的部分,將其完整狀態儲存在乙個所謂的預編譯標頭檔案中。

對於被包含的眾多標頭檔案,注意它們的被包含順序,不同的前後順序就不能使用預編譯標頭檔案。

應該對那些屬於更穩定級別的標頭檔案先進行預編譯,然後在不太穩定的標頭檔案中重用這個穩定的預編譯標頭檔案,從而提高整個編譯效率。

小結:

C Templates學習筆記五 模板實戰

使用分離模型 讓模板定義和宣告在不同的檔案裡可能會導致鏈結錯誤。為了解決這種問題,我們把模板的宣告和定義都放在同乙個標頭檔案裡。例如 ifdef myfirst hpp define myfirst hpp include include template void print typeof t c...

C Templates 模板實參演繹

演繹的過程 描述實參 引數對匹配情況 匹配型別a 來自實參的型別 引數化型別p 來自引數的宣告 如果實參的是陣列或函式型別,那麼會發生decay轉型,轉化為對應的指標型別,同時還會忽略高層次的const和volatile限定符。template void f t p就是t template void...

c template 5 模板實戰

乙份標頭檔案hpp,乙份cpp實現檔案 hpp ifndef myfirst hpp define myfirst hpp declaration of template template void print typeof t const endif myfirst hpp cpp include...