類模板的特化,偏特化

2021-07-16 06:38:25 字數 1701 閱讀 9604

class templates 的特化(specializations)

你可以針對某些特殊的模板引數,對乙個類模板進行特化。類模板的特化與函式模板的過載類似,使你得以針對某些特定型別進行**優化,或修正某個特定型別在函式模板具現化中的錯誤行為。

然而如果你對乙個類模板進行特化,就必須特化其所有成元函式。雖然你可以特化某個單獨的成員函式,但一旦這麼做,也就不再是特化整個 class template。

欲特化某個 class template,必須以 template<> 開頭申明此類,後面跟著你希望的特化結果。特化型別將作為模板引數 並在 class 稱之後直接寫明:

template<>

class stack;

對特化體而言,每個成員函式都必須像常規的成員函式那樣定義,每乙個 t 出現處都必須更換為特化型別:

void stack::push (std::string const& elem)

下面是乙個針對 std::string 型別而特化的 stack<> 的完整範例:

#include

#include

#include

#include "stack1.hpp"

template<>

class stack };

void stack::push (std::string const& elem)

void stack::pop ()

elems.pop_back(); // 移除最後㆒個元素}

std::string stack::top () const

return elems.back(); // 傳回最後㆒個元素的拷貝 }

偏特化

class templates可以被偏特化(或稱部份特化、區域性特化)。這使你得以在特定情形下使用特殊實現碼,但仍然留給你選擇 template parameters 的能力。

例如對於下面的 class template:

template

class myclass ;

以下數種形式的偏特化都是合理的:

// 偏特化:兩個 template parameter 相同

template

class myclass;

// 偏特化:第二個型別為 int

template

class myclass;

// 偏特化:兩個 template parameter 均為指標型別

template

class myclass;

以下例子示範,下列各式使用上述哪乙個 class template:

myclassmif; // 使用 myclass

myclassmff; // 使用 myclass

myclassmfi; // 使用 myclass

myclassmp; // 使用 myclass

如果某個宣告式與兩個(或更多)偏特化版本產生同等的匹配程度,這個宣告式便被視為模稜兩可(歧義):

myclassm; // 錯誤:同時匹配 myclass和 myclass

myclassm; // 錯誤:同時匹配 myclass和 myclass

為解除上述第二宣告的歧義性,你可以針對「指向相同型別」的指標,提供另㆒個偏特化版本:

template

class myclass;

模板的特化(特化和偏特化)

模板特化可以分為全特化和偏特化 特化可以為類增加成員函式或成員變數 模板特化有三種型別,一是特化為絕對型別,二是特化為引用 指標型別,三是特化為另外乙個模板類 include include include usingnamespacestd template classt tmaxr tt1,tt...

C 模板特化 偏特化

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

c 模板特化偏特化

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