C 模版特化

2021-07-24 05:15:18 字數 3196 閱讀 9087

問題:對於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 然後你可以像下面那樣明確地加以特化 ...