4 6類和函式的模板全特化 偏特化(區域性特化)

2021-09-22 10:28:47 字數 2833 閱讀 9277

目錄

1.類模板特化

1.1類模板全特化

1.1.1常規全特化

1.1.2類模板偏特化(區域性特化)

2.函式模板特化

2.1 函式模板全特化

2.2 函式模板不能偏特化

3.模板特化版本放置位置建議

特化:相反的是   泛化:模板,可以隨便指定型別特化:對特殊的型別(型別模板引數)進行特殊的對待。必須先有泛化版本才能存在特化版本。只要設計特化,就一定存在泛化

特化版本**編譯器會優先選擇

#include #include using namespace std;

template struct tc // 泛化的tc類模板

void functest()

};// 當t與u這兩個型別模板引數都為int型別時,我們希望做乙個特化版本

// 全特化就是所有型別模板引數,都需要用具體的型別代表

// 全特化表示所有型別模板引數都用具體型別代表,

// 所以這裡template後面的<>裡為空

template <>

struct tc// 上面的t繫結到第乙個int,上面的u繫結到第二個int

// 對特化版本進行單獨處理

void functest()

};// 當t與u這兩個型別模板引數都為int型別時,我們希望做乙個特化版本

// 全特化就是所有型別模板引數,都需要用具體的型別代表

// 全特化表示所有型別模板引數都用具體型別代表,

// 所以這裡template後面的<>裡為空

template <>

// 上面的t繫結到第乙個double,上面的u繫結到第二個int

struct tc

};int main()

特化成員函式而不是模板

#include #include #include #include using namespace std;

template struct tc //泛化的tc版本

void function()

};template <>

void tc:: function ()

int main()

偏特化從兩個方面說起:乙個是從 模板數量,乙個是從模板引數範圍上。

#include #include #include #include using namespace std;

template struct tc

#include #include using namespace std;

template struct tc // 泛化的tc類模板

void functest()

};// 模板引數範圍上的特化版本

template struct tc

void functest()

};// 模板引數範圍上的特化版本

template struct tc

void functest()

};int main()

模板引數範圍上,int ---- const int (比int小)

t到t*,縮小了

t到 t& t&&  (右值引用)

全特化函式模板實際上等價於例項化 乙個函式模板,並不是等價於乙個函式過載。//void tfunc(int &,double &){}  全特化,等價於例項化乙個函式模板

//void tfunc (int &tmp1,double &temp2) {} 函式過載

#include #include using namespace std;

// 函式模板泛化版本

template void tfunc(t &tmprv, u &tmprv2)

// 函式模板全特化版本 t =int ,u = double

template <>

void tfunc(int &tmprv, double &tmprv2)

// 函式模板過載函式

void tfunc(int &tmprv, double &tmprv2)

int main()

//void tfucn(int &tmpv1, double &tmpv2)

system("pause");

return 0;

}

//編譯器選擇最合適:普通優先,特化版本,泛化版本

//陣列型別模板引數,比 指標型別模板引數更合適。

如果你傳遞字串給函式模板,函式模板的特化版本中有 陣列型別模板引數, 指標型別模板引數。

編譯器會認為 陣列型別模板引數比指標型別模板引數更合適。 所以編譯器會為你選擇陣列型別的模板引數 的特化版本。

寫法就衝突了:c++不支援函式模板偏特化,只能全特化。

模板定義。實現都放在乙個.h的檔案中

模板的特化版本泛化版本,實現都放在同乙個.**件中

.**件中前邊放泛化版本,後邊放特化版本。

模板的全特化和偏特化

特化是什麼?模板引數在某種特定型別下的具體實現稱為模板的特化 為什麼要有特化?因為編譯器認為,對於特定的模板引數型別,如果你實現的更好,那就用你實現的 注意 模板的全特化和偏特化都是在已定義的模板基礎之上,不能單獨存在。還是拿我們之前的順序表舉栗子 templateclass vector temp...

模板的偏特化,全特化

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 特化其實就...