c 模板特化和偏特化

2021-07-11 06:12:28 字數 3117 閱讀 1044

定義乙個棧的類模板,它可以用來容納不同的資料型別,說明如下:

template

class

stack ;

上述定義中,template告訴編譯器這是乙個模板,尖括號中的指明模板的引數,可以有乙個或多個,具體實現時由使用者指定,其中template中的關鍵字class可以用關鍵字typename來代替。

類模板的使用除了要在宣告時指明模板引數外,其餘均與普通的類相同,例如:

stack

int_stack;

stack

ch_stack;

stack

str_stack;

int_stack.push(10);

ch_stack.push(『z』);

str_stack.push(「c++」);

有時為了需要,針對特定的型別,需要對模板進行特化,也就是特殊處理。例如,stack類模板針對bool型別,因為實際上bool型別只需要乙個二進位制位,就可以對其進行儲存,使用乙個字或者乙個位元組都是浪費儲存空間的。

template

class

stack {};

//對模板進行特化:

template

< >

class

stack

;

上述定義中template < >告訴編譯器這是乙個特化的模板。

類模板特化的幾種型別, 一是特化為絕對型別; 二是特化為引用,指標型別;三是特化為另外乙個類模板。!!!!!

以下述**為例:

// general version

template

class compare

};

這是乙個用於比較的類模板,裡面可以有多種用於比較的函式, 以isequal為例。

1、特化為絕對型別

也就是說直接為某個特定型別做特化,這是我們最常見的一種特化方式, 如特化為float, double等。

// specialize for float

template

<>

class compare

};

2、特化為引用,指標型別

除了t*, 我們也可以將t特化為const t*, t&, const t&等,以下還是以t*為例:

// specialize for t*

template

class compare

};

這種特化其實是就不是一種絕對的特化, 它只是對型別做了某些限定,但仍然保留了其一定的模板性,這種特化給我們提供了極大的方便, 如這裡, 我們就不需要對int*, float*, double*等等型別分別做特化了。

3、特化為另外乙個類模板

這其實是第二種方式的擴充套件,其實也是對型別做了某種限定,而不是絕對化為某個具體型別,如下:

// specialize for vector

template

class compare>

}return

true;

}};

這就把isequal的引數限定為一種vector型別,但具體是vector還是vector, 我們可以不關心。

模板的偏特化是指需要根據模板的某些但不是全部的引數進行特化。

例如c++標準庫中的類vector的定義

template

class

vector ;

//對模板的t引數偏特化

template

class

vector

;

這個偏特化的例子中,乙個引數被繫結到bool型別,而另乙個引數仍未繫結需要由使用者指定。

假設現在要定義乙個max函式來返回同一型別(這種型別是允許比較的)兩個值的最大者.

template

t mymax(const t& t1,const t& t2)

template的意義與類模板定義中相同。

模板函式的使用與普通非模板函式使用相同,因為模板函式的引數可以從其傳入引數中解析出來。例如:

int highest = mymax(5,10);

char c = mymax(『a』, 』z』);

mymax(5,10)解析出模板函式引數為int,mymax(『a』, 』z』)解析出模板函式的引數為char。

看下面的例子

main()

前面兩個mymax都能返回正確的結果。而第三個卻不能,因為此時mymax直接比較兩個指標p1 和 p2 而不是其指向的內容。

針對這種情況,當mymax函式的引數型別為const char* 時,需要特化。

template

t mymax(const t t1, const t t2)

//對函式模板進行特化:

template

<>

const

char* mymax(const

char* t1,const

char* t2)

現在mymax(p1,p2)能夠返回正確的結果了。

嚴格的來說,函式模板並不支援偏特化!!!,但由於可以對函式進行過載,所以可以達到類似於類模板偏特化的效果。

C 模板特化和偏特化

1.引言 c 中的模板分為類模板和函式模板,雖然它引進到c 標準中的時間不是很長,但是卻得到了廣泛的應用,這一點在stl中有著充分的體現。目前,stl在c 社群中得到了廣泛的關注 應用和研究。理解和掌握模板是學習 應用和研究以及擴充stl的基礎。而stl模板例項中又充斥著大量的模板特化和偏特化。2....

C 模板特化和偏特化

使用模板時會遇到一些特殊的型別需要特殊處理,不能 或不希望 直接使用當前的模板版本時,所以此時我們就需要對該型別定義乙個類或函式的特例化版本。例 當使用乙個判斷相等的模板函式時 templatebool isequal t p1,t p2 但是該模板函式在對於字串進行比較時就不能使用了,對於字串我們...

C 模板特化 偏特化

注意 特化時模板引數的先後順序不能變 特化是基於泛化版本進行的 函式模板特化過載與函式過載不衝突 函式模板只能全特化不能偏特化 模板類泛化 templateclass mytest int m func 模板類全特化 template class mytest 模板類偏特化 templateclas...