C 模板特化和偏特化

2021-09-27 08:10:11 字數 2208 閱讀 8930

使用模板時會遇到一些特殊的型別需要特殊處理,不能(或不希望)直接使用當前的模板版本時,所以此時我們就需要對該型別定義乙個類或函式的特例化版本。

例:當使用乙個判斷相等的模板函式時

templatebool isequal(t& p1, t& p2)
但是該模板函式在對於字串進行比較時就不能使用了,對於字串我們不能直接比較,因此直接特化出乙個專門供字串使用的模板引數:

template<> 								// 此處不新增型別模板,直接使用空即可

bool isequal(char*& p1, char*& p2)

【注意】

(1)模板及其特例化版本應該宣告在同乙個標頭檔案中。所有同名模板的宣告應該放在前面,然後是這些模板的特例化版本。

(2)使用特換模板函式時格式有要求:

(3)特化的函式的函式名,引數列表要和原基礎的模板函式相同,避免不必要的錯誤。

(4)特例化版本本質上是乙個例項,而非函式名的乙個過載版本。

(5)當乙個非模板函式提供與函式模板同樣好的匹配時,編譯器會選擇非模板版本。

(6)如果丟失了乙個特例化版本宣告,編譯器通常用原模板生成**。由於在丟失特化版本時編譯器通常會例項化原模板,很容易產生模板及其特例化版本宣告順序導致錯誤,而這種錯誤又很難查詢。

模板特化分為全特化和偏特化(對模板的型別做一些限制),其中全特化適用於函式模板和類模板,偏特化只適用於類模板。

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

(1)全特化

全特化: 將所有的模板型別都進行特化。

例:

// 普通模板

template class test

// 全特化模板

template <> // 此處同函式模板的特化一樣不用寫內容

class test

(2)偏特化

偏特化分為兩種:一種是部分特化,另一種是對模板型別的進一步限制。

例:部分特化

// 普通類模板

template class test2

// 部分特化類模板

template // 此處只需寫未進行特化的模板型別,特化過的就不用寫

class test2

例:對模板型別的範圍的限制,主要的基礎型別不變

// 普通模板

template class test2

// 對模板型別的範圍做出一定的限制

template // 此處只需寫未進行特化的模板型別

class test2

例:

// 原始的、最通用的版本

template struct remove_reference;

// 部分特化版本,用於左值引用和右值引用

template struct remove_reference;

template struct remove_reference;

// 模板的呼叫

int i;

// decltype(42)為int,使用原始模板

remove_reference::type a;

// decltype(i)為int&,使用第乙個(t&)部分特化版本

remove_reference::type b;

// decltype(std::move(i)為int&&,使用第二個(t &&)部分特化版本

remove_reference::type c;

我們可以只特化類中特定成員函式而非特化整個模板。

例:只特化foo中的bar

template struct foo

void bar() {}

t met;

};template<>

void foo::bar(){}

// 呼叫

foofs; // 例項化foo::foo()

fs.bar(); // 例項化foo::bar()

foofi; // 例項化foo::foo()

fi.bar(); // // 例項化foo::foo()

C 模板特化和偏特化

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

c 模板特化和偏特化

定義乙個棧的類模板,它可以用來容納不同的資料型別,說明如下 template class stack 上述定義中,template告訴編譯器這是乙個模板,尖括號中的指明模板的引數,可以有乙個或多個,具體實現時由使用者指定,其中template中的關鍵字class可以用關鍵字typename來代替。類...

C 模板特化 偏特化

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