深入分析C 模板特化與偏特化

2022-09-25 06:57:10 字數 2971 閱讀 5060

1.模板特化

1.1概述

模板特化(template specialization)不同於模板的例項化,模板引數在某種特定型別下的具體實現稱為模板的特化。模板特化有時也稱之為模板的具體化,分別有函式模板特化和類模板特化。

1.2函式模板特化

函式模板特化是在乙個統一的函式模板不能在所有型別例項下正常工作時,需要定義型別引數在例項化為特定型別時函式模板的特定實現版本。檢視如下例子。

#include

using namespace std;

template t max(t t1,t t2)

typedef const char* ccp;

template<> ccp max(ccp s1,ccp s2)

int main()

程式執行結果和使用函式模板特化相同。但是,使用普通函式過載和使用模板特化還是有不同之處,主要表現在如下兩個方面:

(1)如果使用普通過載函式,那麼不管是否發生實際的函式呼叫,都會在目標檔案中生成該函式的二進位制**。而如果使用模板的特化版本,除非發生函式呼叫,否則不會在目標檔案中包含特化模板函式的二進位制**。這符合函式模板的「惰性例項化」準則。

(2)如果使用普通過載函式,那麼在分離編譯模式下,應該在各個原始檔中包含過載函式的申明,否則在某些原始檔中就會使用模板函式,而不是過載函式。

1.3類模板特化

類模板特化類似於函式模板的特化,即類模板引數在某種特定型別下的具體實現。考察如下**。

#include

using namespace std;

templateclass a

void print()

void print()

程式輸出結果如下:

a'num:6

a' special definition

2.模板偏特化

2.1概述

模板偏特化(template partitial specialization)是模板特化的一種特殊情況,指指定模板引數而非全部模板引數,或者模板引數的一部分而非全部特性,也稱為模板部分特化。與模板偏特化相對的是模板全特化,指對所有的模板引數進行特化。模板全特化與模板偏特化共同組成模板特化。

模板偏特化主要分為兩種,一種是指對部分模板引數進行全特化,另一種是對模板引數特性進行特化,包括將模板引數特化為指標、引用或是另外乙個模板類。

2.2函式模板偏特化

假如我們有乙個compare函式模板,在比較數值型別時沒有問題,如果傳入的程式設計客棧數值的位址,我們需要兩個數值的大寫,而非比較傳入的位址大小。此時我們需要對compare函式模板進行偏特化。考察如下**:

#include

#include

using namespace std;

//函式模板

template void compare(t num1, n num2)

//將模板引數特化為指標

template void compare(t* num1, n* num2)

//將模板引數特化為另乙個模板類

template void compare(std::vector& vecleft, std::vector& vecright)

int main()

;vector vecright;

compare(vecleft,vecright); //呼叫偏特化版本compare程式設計客棧,char>(int* num1, char* num2)

}程式輸出結果ajkoatnaeo如下:

standard function template

num1:30 <= num2:31

partitial specialization

num1:30 <= num2:1

new partitial specialization

num1:30 <= num2:1

to vector partitial specialization

vecleft.size()1 <= vecright.size():3

2.3類模板偏特化

類模板的偏特化與函式模板的偏特化類似。考察如下**:

#include

#include

using namespace std;

//類模板

template class testclass

;vector vecright;

cout << testclass, vector>::comp(vecleft,vecright) << endl;

}程式輸出結果:

standard class template

1partitial specialization

1new partitial specialization

1to vector partitial specialization

13.模板類呼叫優先順序

對主版本模板類、全特化類、偏特化類的呼叫優先順序從高到低進行排序是:主版本模板類。這樣的優先順序順序對效能也是最好的。

但是模板特化並不只是為了效能優化,更多是為了讓模板函式能夠正常工作,最典型的例子就是stl中的iterator_traits。algorithm中大多數演算法通過iterator物件來處理資料,但是同時允許以www.cppcns.com指標代替iterator物件,這是為了支援c-style array。如果直接操作iterator,那麼為了支援指標型別,每個演算法函式都需要進行過載,因為指標沒有::value_type型別。為了解決這個問題,stl使用了iterator_traits對iterator特性進行封裝,並為指標型別做了偏特化處理,演算法通過它來操作iterator,不需要知道實際操作的是iterator物件還是指標。

template class iterator_traits

...template class iterator_traits

...template class iterator_traits

...後面兩是針對指標型別的偏特化,也是偏特化的一種常見形式。

C 模板 特化 與 偏特化

c 模板作為乙個泛化手段,與之相對,對於某種特殊場合,可能要對模板進行相應的特化,偏特化處理。模板為什麼要特化,因為編譯器認為,對於特定的型別,如果你能對某一功能更好的實現,那麼就該聽你的。模板分為類模板與函式模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體型別,偏特化就是如果這個模板有...

C 模板特化 偏特化

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

c 模板特化偏特化

模板為什麼要特化,因為編譯器認為,對於特定的型別,如果你對某一功能有更好地實現,那麼就該聽你的。模板分為類模板與函式模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體型別,偏特化就是模板如果有多個型別,那麼就只限定為其中的 一部分,其實特化細分為範圍上的偏特化與個數上的偏特化。模板的泛化 ...