C 模版特例化和模版偏特化

2022-07-29 12:30:10 字數 1102 閱讀 1899

例子:

//第乙個版本;可以比較任意兩個型別

template

int compare(const &t,const t&);

//第二個版本處理字串字面常量;過載實現

template

int compare(const

char(&)[n],const

char (&)[m]);

//第三個版本;模版特例化

template

<> int compare(const

char*const &p1,const

char*const &p2);

當定義函式模版的特例化版本時,我們本質上接管了編譯器的工作。即,我們為原模版的乙個特殊例項提供了定義。重要的是要弄清:乙個特例化版本本質上是乙個例項,而非函式名的乙個過載版本

因此,如果我們使用了下面的呼叫:

compare("hi","tom");
使用兩個函式模版都是可行的,且提供同樣好的匹配。但是,接受字元陣列引數的版本更特例化,因此編譯器會選擇它。

類模版部分特例化(partial specialization)

注意:我們只能部分特例化類模版,而不能部分特例化函式模版。

//原始的,最通用的版本

template

struct remove_reference;

//部分特例化版本,將用於左值引用和右值引用

template

struct remove_reference//左值引用

template

struct remove_reference//右值引用

由於部分特例化版本本質是乙個模版,所以我們首先定義模版引數。類似任何其他特例化版本,部分特例化版本的名字和原模版名字相同,對每個未完全確定型別的模版引數,在特例化版本的模版引數列表中都有一項與之對應。在類名後,我們要為特例化的模版引數指定實參,這些實參列於模版名之後的尖括號中,這些實參與原始模版中的引數按位置對應。

模版的特化和偏特化

模版的特化與偏特化 模板為什麼要特化,因為編譯器認為,對於特定的型別,如果你能對某一功能更好的實現,那麼就該聽你的。模板分為類模板與函式模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體型別,偏特化就是如果這個模板有多個型別,那麼只限定其中的一部分。partial template spe...

模版特例化

模板是編譯時多型,函式體內是執行時,執行時判斷型別是type id函式返回type info型別的物件 這裡只需要個模板特化就可以了 templatet work t template 特化版 int work int a 也就是你要知道t是什麼型別,你就必須提供靜態版本的多型.編譯時不可能有什麼函...

模版的特化與偏特化

partial template specialization能夠讓你在模板 template 的所有可能的實體中特化出一組子集.1.模板的特化 template specialization 例如,定義如下的乙個模板 template class widget 然後你可以像下面那樣明確地加以特化 ...