2007年07月11日

C++ Template 筆記

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)。函數原型的函數名稱即為函數樣板的名稱。

參數型態可用關鍵字 classtypename 表示泛用型態 (即任何型態);或是一個已宣告的資料型態,如 int 與自定類。原型中的參數型態若是已宣告的資料型態,則是一種特殊化的函數樣板。

題外話。多數動態語言並不需要樣板,它們原本就具有泛型處理的語意與概念。

Class Template (類別樣板)

語法與函數樣板相同,差別在其原型為類別。此外,樣板參數可以設定預設值。

套用類別樣板的語法則是以樣板名稱括起參數值,括號用 < >。如: templateName<argument>

部份特殊化 (partial specialization)

套用一個通用型的樣板以宣告特殊情形的樣板,特殊情形的樣板參數指明採用已宣告之資料型態。對編譯器而言,特殊化樣板是添加在通用型樣板之下的特殊適用條例,並不是一個新樣板。編譯器視實際的參數型態決定援引一般條例或特殊條例,不需程序員指示。

原型之函數成員特殊化

原型的方法(函數成員)特殊化。特殊化的原型方法不可以寫在類別樣板的宣告中。語法是以套用類別樣式之敘述代替函數成員的類別範圍,且樣板參數值須為已宣告之資料型態。

特殊類別的樣板

當特殊化樣板之樣板參數列為空值,亦即不接受任何型態參數時,此特殊化樣板是一個被當成樣板的類別。

當樣板參數列為空值時,則原型中出現的資料型態都必須指明為已宣告的資料型態。此時程序員的工作與設計一個傳統類別 (non-template class) 無異。差別僅在編譯器將此類別視為一個樣板,故使用時不需要區分兩者。


Posted by shirock at 樂多Roodo! │16:35 │回應(0)引用(0)C/C++
樂多分類:網路/3C 共同主題:C/C++ 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/3641717