Tags: C++ template metaprogramming
C++ 的 Template 是種將資料型態參數化的功能。將資料型態資訊自程式碼中抽離,代之以簡化的符號 (T, T1, T2, ...)。再由編譯器透過類似巨集代換的方式,根據樣板內容產生實際的程式碼。
- Function Template (函數樣板)
- Class Template (類別樣板)。含部份特殊化。
Function Template (函數樣板)
以關鍵字 template 起始一個樣板宣告,後接參數。C/C++ 的程式語法,是以 ( )
括起參數。而 Template 語法,則以 < >
括起參數。樣板所用參數之完整稱呼是「樣板參數(template parameters)」,慣例以 T, T1, T2 等作為樣板參數名稱。接著再寫上函數的程式碼樣板,又稱原型 (prototype)。函數原型的函數名稱即為函數樣板的名稱。
參數型態可用關鍵字 class 或 typename 表示泛用型態 (即任何型態);或是一個已宣告的資料型態,如 int 與自定類。原型中的參數型態若是已宣告的資料型態,則是一種特殊化的函數樣板。
題外話。多數動態語言並不需要樣板,它們原本就具有泛型處理的語意與概念。
Class Template (類別樣板)
語法與函數樣板相同,差別在其原型為類別。此外,樣板參數可以設定預設值。
套用類別樣板的語法則是以樣板名稱括起參數值,括號用 < >
。如: templateName<argument>
。
部份特殊化 (partial specialization)
套用一個通用型的樣板以宣告特殊情形的樣板,特殊情形的樣板參數指明採用已宣告之資料型態。對編譯器而言,特殊化樣板是添加在通用型樣板之下的特殊適用條例,並不是一個新樣板。編譯器視實際的參數型態決定援引一般條例或特殊條例,不需程序員指示。
原型之函數成員特殊化
原型的方法(函數成員)特殊化。特殊化的原型方法不可以寫在類別樣板的宣告中。語法是以套用類別樣式之敘述代替函數成員的類別範圍,且樣板參數值須為已宣告之資料型態。
特殊類別的樣板
當特殊化樣板之樣板參數列為空值,亦即不接受任何型態參數時,此特殊化樣板是一個被當成樣板的類別。
當樣板參數列為空值時,則原型中出現的資料型態都必須指明為已宣告的資料型態。此時程序員的工作與設計一個傳統類別 (non-template class) 無異。差別僅在編譯器將此類別視為一個樣板,故使用時不需要區分兩者。
樂多舊網址: http://blog.roodo.com/rocksaying/archives/3641717.html