特化是什麼? 模板引數在某種特定型別下的具體實現稱為模板的特化
為什麼要有特化? 因為編譯器認為,對於特定的模板引數型別,如果你實現的更好,那就用你實現的
注意:模板的全特化和偏特化都是在已定義的模板基礎之上,不能單獨存在。
還是拿我們之前的順序表舉栗子:
上面使用模板構建了乙個順序表,傳參的時候必須顯示的指定 vector型別templateclass vector
;templatevector::vector() :_size(0), _capacity(3), _data(new t[_capacity])
templatevector::~vector()
int main()
否則編譯器會報錯,會告訴我們類模板必須有模板引數列表,否則在開闢空間的時候不知道開多大的空間
全特化:全特化就是限定死模板實現的具體型別,
在以上的**前提下,加這樣一段**,顯示指定模板型別為int
當存在兩份類的**(當然第乙份是建立物件以後才例項化出**的),一種是普通模板,一種是全特化模板,這時候我們如果給模板傳參vector,編譯器會呼叫哪乙份**呢?template<>
class vector;
vector::vector() :_size(0), _capacity(3), _data(new int[_capacity])
vector::~vector()
答案是顯而易見的,當我們有全特化的模板類以後,定義出 乙個 全特化型別 的 類物件時,首先呼叫的是全特化的**
這就像是如果你家裡已經有一碗下好的麵條了(全特化),你就不會再去自己買麵,再自己下了(普通類模板)...
如果我們要定義乙個非全特化模板型別的物件,那他會呼叫誰呢?
以上**說明,vectorv1 呼叫的是全特化類,vectorv2呼叫的是普通模板類,因為函式呼叫時使用的是呼叫棧,滿足先進後出的特性,所以會先析構後建立的物件
偏特化(區域性特化):偏特化就是如果這個模板有多個型別,那麼只限定其中的一部分。
我們換乙個多個模板引數的栗子:
定義物件的時候必須顯示例項化模板引數型別templateclass date
;templatedate::date()
我們只特化其中乙個模板引數型別,如下:int main()
可以看到,我們在定義類成員函式的時候,只需要將沒有被特化的模板引數templateclass date;
templatedate::date()
下面的定義物件的時候都呼叫哪乙個**呢?
我們可以觀察到,只要第二個引數是int型,那麼就會呼叫我們偏特化的模板類
但是只要第二個引數不為int,就會呼叫我們普通的模板類(d6)
區域性特化兩個引數為指標:
區域性特化兩個引數為引用:templateclass date;
templatedate::date()
date();
protected:
t1* _pt1;
t2* _pt2;
};templatedate::date()
再次注意:模板的全特化和偏特化都是在已定義的模板基礎之上,不能單獨存在。
模板的偏特化,全特化
c 中的模板分為類模板和函式模板 模板的特化分為倆種 全特化和偏特化 全特化 舉乙個簡單的例子 可以發現,ab呼叫的是我們全特化後的版本,而aa呼叫的是原始版本。偏特化 偏特化又稱為區域性特化,全特化是對所有的模板引數進行特化,偏特化是對區域性的引數特化 乙個簡單的例子 templateclass ...
C 模板全特化 偏特化
大家都對c 的模板程式設計應該都能很熟練使用了,下面就是一段很簡單不過的例子了 模板函式 templatevoid func t num1,n num2 cout num1 num1 num2 num2 static bool comp t num1,n num2 return num1 特化其實就...
C 模板的全特化和偏特化
全特化一般用於處理有特殊要求的類或者函式,此時依靠泛型模板無法處理這種情況。因此全特化可以運用在類模板和函式模板當中。其模板引數列表為空。template class a template void func int arg 對部分引數進行指定初始化,類模板可以實現偏特化,而函式模板不能實現偏特化,...