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