日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++模板泛型编程

發布時間:2024/9/21 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++模板泛型编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

---恢復內容開始---

一、泛型編程

? ? ? 定義:編寫與類型無關的邏輯代碼,是代碼復用的一種手段。模板是泛型編程的基礎

? ? ? 模板分為:函數模板和類模板

? ? ? 函數模板:代表了一個函數家族,該函數與類型無關,在使用時被參數化,根據實參類型產生函數的特定類型版本。

? ? ? 函數模板的格式:template<typename p1,typename p2,...,typename p> ? //typename和class都可以定義模板參數一般建議使用typelate好理解和類關鍵字區分

? ? ? ? ? ? ? ? ? ? ? ? ? ? 返回值類型 ?函數名(參數列表)? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ?{...}? ?

? ? ?模板是藍圖,本身不是類或者函數,編譯器用模板產生特定的類或者函數的特定類型版本,產生模板特定類型的過程成為模板的實類化??

? ? ?

定義模板關鍵字:T是模板參數名字可以任意命名,下面代碼返回值是T類型這個很重要
1
template<typename T> 2 T Add(T left,T right) 3 { 4 return left+right; 5 } 6 7 int main() 8 { 9 cout<<Add(1,2)<<endl;; 10 return 0; 11 }
//給main()函數里加一句cout<<Add(1.2,2.3)<<endl;函數模板將被編譯兩次
// 1.實類化之前,檢查模板代碼本身,查看是否出現語法錯誤,如:遺漏分號。2.在實類化期間,檢查模板代碼,查看是否所有的調用都有效,如:實類化理性不支持某些函數調用 這個返回值是T1,配合下面代碼就是int ,函數返回值類型很重要,所以這里還是認真點
1
template<typename T1,typename T2> 2 T1 Add(T1 left,T2 right) 3 { 4 return left+right; 5 } 6 7 int main() 8 { 9 cout<<Add(1,'2')<<endl;; 10 return 0; 11 }

模板函數也可以定義為inline函數

1 template<typename T1,typename T2> 2 inline T2 Add(T1 left,T2 right) 3 { 4 return left+right; 5 } 6 7 int main() 8 { 9 cout<<Add(1,'2')<<endl;; 10 return 0; 11 } 12 //返回值是字符3

? 模板參數:

? ? 模板函數有兩種類型形參:模板參數和調用參數

? ? 模板形參分為:類型形參和非類型形參

//模板形參名字只能在模板形參之后到模板聲明或定義的末尾之間使用,遵循名字屏蔽規則
1
typedef int T; 2 template<typename T> 3 void FunTest(T t) 4 { 5 cout<<"t type = "<<typeid(t).name()<<endl; 6 } 7 T gloab; 8 int main() 9 { 10 FunTest(10); 11 cout<<"gloab type = "<<typeid(gloab).name()<<endl; 12 return 0; 13 }

eg:判斷下面函數定義是否有問題

1 //template<class T,U,typename V> 2 //void F1(T,U,V); 3 //模板參數不能這樣定義,模板參數前必須加上定義模板參數關鍵字class或者typeame 4 //template<class T> 5 //T F2(int &T); 6 7 //template<class T> 8 //T F3(T,T); 9 //typedef int TYPENAME; 10 //template<typename TYPENAME> 11 //TYPENAME F4(TYPENAME);

模板函數重載:

主要看看下列情況調用哪個函數
1
int Max(const int& left,const int& right)//1 2 { 3 return (left>right)?left:right; 4 } 5 template<typename T> //2 6 T Max(const T& left,const T&right) 7 { 8 return (left>right)?left:right; 9 } 10 template<typename T> //3 11 T Max(const T& a,const T& b,const T& c) 12 { 13 return Max(Max(a,b),c); 14 } 15 int main() 16 { 17 Max(10,20,30);//3 18 Max<>(10,20);//2 19 Max(10,20); //1 20 Max(10,20.0);//1 21 Max<int>(10.0,20.0);//2 22 Max(10.0,20.0);//2 23 return 0; 24 }
//注意:函數的所有重載版本的是聲明都應該位于該函數被調用位置之前

二、模板函數特化

? ? 在某些情況下,通用模板定義對于某個類型可能是完全錯誤的,或者不能編譯,或者做一些錯誤的事情

? ??

1 template<class T> 2 int compare(T t1,T t2) 3 { 4 if(t1>t2) 5 return 1; 6 else if(t1<t2) 7 return -1; 8 else 9 return 0; 10 } 11 int main() 12 { 13 char *pStr1="holle"; 14 char *pStr2="world"; 15 cout<<compare(pStr1,pStr2)<<endl; 16 return 0; 17 }
//結果是1,實際是-1

? ? ?模板函數特化形式:

? ? ? ? 1、關鍵字template后面跟一個空的<>

? ? ? ? 2、再接模板名和<模板形參>

? ? ? ? 3、函數形參表

? ? ? ? 4、函數體

?

三、模板類

? ? ? 模板類型格式

? ? ? template<typename p1,typename p2,...,typename p>

? ? ? class 類名?

? ? ? {...}

eg:
1
template<typename T> 2 class SeqList 3 { 4 private: 5 T* _Data; 6 int _size; 7 int _capacity 8 } 1 //以模板方式實現動態順序表 2 3 template<typename T> 4 class SeqList 5 { 6 public: 7 SeqList(); 8 ~SeqList(); 9 private: 10 int _size; 11 int _capacity; 12 T* _Data; 13 }; 14 template<typename T> 15 SeqList<T>::SeqList() 16 :_size(0) 17 ,_capacity(10) 18 ,_Data(new T[_capacity]) 19 {} 20 template<typename T> 21 SeqList<T>::~SeqList() 22 { 23 delete []_Data; 24 } 25 void FunTest() 26 { 27 //SeqList Seq; 28 SeqList<int>s1; 29 SeqList<double>s2; 30 }
//有一種不同的類型編譯器就會實類化出對應的一個類

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

---恢復內容結束---

轉載于:https://www.cnblogs.com/JN-PDD/p/6028803.html

總結

以上是生活随笔為你收集整理的C++模板泛型编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。