模板的全特化和偏特化

2021-08-19 23:53:27 字數 2469 閱讀 1719

特化是什麼? 模板引數在某種特定型別下的具體實現稱為模板的特化

為什麼要有特化? 因為編譯器認為,對於特定的模板引數型別,如果你實現的更好,那就用你實現的

注意:模板的全特化和偏特化都是在已定義的模板基礎之上,不能單獨存在。

還是拿我們之前的順序表舉栗子:

templateclass vector

;templatevector::vector() :_size(0), _capacity(3), _data(new t[_capacity])

templatevector::~vector()

int main()

上面使用模板構建了乙個順序表,傳參的時候必須顯示的指定 vector型別

否則編譯器會報錯,會告訴我們類模板必須有模板引數列表,否則在開闢空間的時候不知道開多大的空間

全特化:全特化就是限定死模板實現的具體型別,

在以上的**前提下,加這樣一段**,顯示指定模板型別為int

template<>

class vector;

vector::vector() :_size(0), _capacity(3), _data(new int[_capacity])

vector::~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 對部分引數進行指定初始化,類模板可以實現偏特化,而函式模板不能實現偏特化,...