問題:對於compare 函式模板,與 c 風格字串一起使用,它們都不能正確工作:
// 函式模版定義
template int compare(const t &v1, const t &v2)
如果用兩個 const char* 實參呼叫這個模板定義,函式將比較指標值:
cout << compare( "abc", "123" ); //使用char * 實參呼叫函式模版它將告訴我們這兩個指標在記憶體中的相對位置,但沒有說明歸
納法指標所指陣列的。
為了能夠將 compare 函式用於字串,必須提
供乙個知道怎樣比
較 c 風格
字串的特殊定義,這就是函式模
版的特化
(template specialization)
版本。對使用者而
言,呼叫特化函
數或使用特化類,與使用從通用模板
例項化的版本無法區別。
模板特化定義:乙個或多個模板形參的實際型別或實際值是指定的。特化的形式如下:
一、函式模板的特化
以compare函式為例,當模板形參型別繫結到 const char* 時:
//函式模版特化為 const char *
template <>
int compare( const char* const &v1, const char* const &v2 )
注意:特化的宣告必須與對應的模板相匹配
const char *cp1 = "world", *cp2 = "hi";
int i1, i2;
compare( cp1, cp2 ); // 呼叫特化版本
compare( i1, i2 ); // 呼叫普通模版
如果過載乙個 const char *版本的compare函式時:
int compare(const char* const&, const char* const&);呼叫compare函式時能夠實現相同的功能,但是,過載函式與特化的函式模型區別在於:
二、類模板的特化
類模版會出現與函式模版類似的問題。預設情況下,複製 c 風格字串只會複製指標,不會複製字元。這種情況下複製指標將出現
共享指標在其他環
境中會出現的所有問題,最嚴重的是,如果指標指向動態記憶體,使用者就有可能刪除指標所指的陣列。
// 類模版定義
templateclass compare ;
// 特化為 const char *
template<> class compare;
注意:在特化整個類模版時,外部定義成員之前不能加 template<> 標記。
1.類模版部分特化
除了特化整個模版外,還可以只特化某些成員函式。這就與函式模版特化類似了。
// 只對equal 函式進行特化
template<> class compare;
2.全特化與偏特化
如果乙個模板有多個型別,那麼只限定其中的一部分。
// 模版類定義
template class test
private:
t1 a;
t2 b;
};//全特化
template <>
class test
private:
int a;
string b;
};//偏特化
template class test
private:
int a;
t2 b;
};
三、類模版特化的型別
1.特化為絕對型別
類模版特化為絕對型別,即直接為某個特定型別定義類模板。(二)中類模版的特化,特化為 const char* 型別,即是特化為絕對型別。如果特化為
float 型別:
// 特化為 float
template<>
class compare;
//可以這樣使用float的特化模版:
float f1 = 10,
f2 = 10;
bool c = compare::equal( f1, f2 );
2.特化為引用、指標型別
這種特化不是一種絕對的特化, 它只是對型別做了某些限定,但仍然保留了其一定的模板性,這種特化給我們提供了極大的方便,就不需要對int*,
float*, double*等等型別分別做特化了。
// 特化為 t*
templateclass compare;
// 可以這樣使用特化為指標型別的模版:
int n1 = 10,
n2 = 10;
int *np1 = &n1,
*np2 = &n2;
bool c = compare::equal( np1, np2 );
3.特化為另乙個類模版
對型別做某種限定,但又不絕對化。
// 特化為 vector,t可以為 int,string 等
template class compare>
return true;
}};//可以這樣使用這個特化版本:
vectorv1;
for( int i = 0; i != 10; ++i )
v1.push_back(i);
vectorv2(v1);
bool res = compare>::equal( v1, v2 );
C 模版全特化 偏特化 型別萃取
什麼是特化?沒有特化的c 模版中,不管傳入引數是什麼型別,都是一樣的處理方式。但是當我們需要針對某個特定的型別做特殊的處理的時候,這個時候就需要用到特化了。全特化 我們可以將某乙個類或某乙個函式單獨拿出來特化。舉個例子 template class t class vector private si...
C 模版特例化和模版偏特化
例子 第乙個版本 可以比較任意兩個型別 template int compare const t,const t 第二個版本處理字串字面常量 過載實現 template int compare const char n const char m 第三個版本 模版特例化 template int co...
模版的特化與偏特化
partial template specialization能夠讓你在模板 template 的所有可能的實體中特化出一組子集.1.模板的特化 template specialization 例如,定義如下的乙個模板 template class widget 然後你可以像下面那樣明確地加以特化 ...