目錄
- 函式模板
- 類模板
- 類模板與派生
- 類模板與友元
- 類模板中的static成員
作用:提高程式可復用性,程式編譯時自動生成相應函式
函式模板和類模板中的型別引數表中class和typename可相互替換
函式模板
-
格式
template<class T1,class T2,...> 回傳值型別 模板名(引數表){ 函式體 } -
匹配順序
- 引數完全匹配的普通函式
- 引數完全匹配的模板函式(匹配模板函式時,不會進行自動型別轉換)
- 實參經過自動型別轉換 后匹配的普通函式
- 上述匹配均不存在則報錯
-
可通過
模板函式名<型別>不通過引數實體化 -
模板函式也可以多載,只要形參表或型別引數表不同即可
-
支持函式指標型別
#include<iostream> using namespace std; template<class T,class Pred> void Map(T s,T e,T x,Pred op){ for(;s!=e;s++,x++) *x=op(*s); } double Square(double x){return x*x;} int Cube(int x){return x*x*x;} template<class T> void Output(T &arr){ for(int i=0;i<(sizeof(arr)/sizeof(*arr));++i) cout<<arr[i]<<" "; cout<<endl; } int main(){ int a[5]={1,2,3,4,5},b[5]; double d[5]={1.1,2.2,3.3,4.4,5.5},c[5]; Map(a,a+5,b,Square); Output(b); Map(a,a+5,b,Cube); Output(b); Map(d,d+5,c,Square); Output(c); return 0; }
類模板
-
定義方式:
template<class T1,class T2,...> class ClassName{ Member Function; Member Variable; ReturnType Func(Parameter Table); } //在類外定義成員函式 template<class T1,class T2,...> ReturnType ClassName<T1,T2,...>::Func(Parameter Table){ ... } //通過類模板定義物件 ClassName<T1,T2,...> Obj; //類模板的型別引數表可以包含非型別引數 template<class T,int size> class Count{ public: T arr[size]; void Output(){ for(int i=0;i<size;++i) cout<<arr[i]<<endl; } } Count<double,50> test; -
在類模板內定義函式模板
class Test{ public: template<class T2> void Func(T2 a){ cout<<a<<endl; } }; int main(){ Test<int> a; a.Func("Test"); return 0; } -
編譯器由類模板生成類的程序稱為類的實體化,生成的類稱為模板類
-
同一類模板生成的不同模板類不兼容(即兩個獨立不同的型別)
類模板與派生
-
類模板從類模板派生
-
類模板從模板類派生
-
類模板從普通類派生
-
普通類從模板類派生
template<class T1,class T2> class A{ T1 v1; T2 v2; } //類模板從類模板中派生 template<class T1,class T2> class B:public A<T2,T1>{ //A模板實體化順序不一定相同 T1 v3; T2 v4; } //類模板從模板類派生 template<class T> class B:public A<int,double>{} //類模板從普通類中派生 class C{int a;} template<class T> class B:public C{ T val; } //普通類從模板類中派生 class D:public A<int,double>{ int a;}
類模板與友元
-
函式、類、類成員函式作為類模板友元
void Func1(){} class A{ int a; public: void Func(){} } template<class T> class B{ T a; public: friend void Func1(); //友元函式 friend class A; //友元類 friend void A::Func(); //類成員函式作為友元類 } -
函式模板作為類模板友元
template<typename T1,typename T2> class Pair{ T1 key; T2 value; public: Pair(T1 k,T2 v):key(k),value(v){} //函式模板作為類模板友元 template<class T3,class T4> //不能寫T1、T2,否則可能報錯 friend ostream& operator<< (ostream &out,const Pair<T3,T4> &p); }; template<class T1,class T2> ostream& operator<< (ostream& out,const Pair<T1,T2> &p){ return out<<"("<<p.key<<","<<p.value<<")"<<endl; } -
函式模板作為類的友元
class A{ int v; public: A(int n):v(n){} template<class T> friend void Print(const T& p); } template<class T> void Print(const T& p){cout<<p.v;} int main(){ A a(10); Print(a); return 0; } -
類模板作為類模板友元
template<class T> class A{ T v; public: A(int n):v(n){} template<class T2> //不能寫成T,可能報錯 friend class B; } template<class T> class B{ public: void Func(){ A<int> o(10); cout<<o.v<<endl; } }
類模板中的static成員
-
統一類模板的不同型別的實體static相互獨立,相同型別示例共用
class A{ static int count; public: void PrintCnt(){ cout<<count<<endl; } A(){count++;} ~A(){count--;} A(A&){count++;} }; template<> int A<int>::count=0; //類模板中static變數宣告方式 template<> int A<double>::count=0; int main(){ A<int> a,c; a.PrintCnt(); //2 A<double> b; b.PrintCnt(); //1 return 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/42985.html
標籤:C++
上一篇:SpringMVC資料回應 ModelAndView 設定資料后前端jsp 獲取資料失敗
下一篇:第八章 標準模板庫STL(一)
