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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++模版函数

發布時間:2025/3/15 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++模版函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++中的模版總體可以分為兩大類:模版函數、模版類。本篇文章先寫模版函數,接下來會介紹模版類。

定義:模版函數是通用的函數描述,也就是說它們使用通用類型來定義,其中的通用類型可用具體類型替換。

代碼實例:

#include <iostream>//模版函數的聲明 template<typename T> void Swap(T& a,T& b);int main() {int i = 10;int j = 20;std::cout<<"i=" << i << "," << "j=" <<j;Swap(i,j);//生成 void Swap(int &,int&);std::cout<<"i=" << i << "," << "j=" <<j;double x = 11.5;double y = 19.5;std::cout<<"x=" << x << "," << "y=" <<y;Swap(x,y);//編譯器生成 void Swap(double &,double&);std::cout<<"x=" << x << "," << "y=" <<y;return 0; }//模版函數的定義 template<typename T> void Swap(T& a,T& b) {T temp;temp = a;a = b;b = temp; }

以上實例為最簡單的函數模版實例,編譯器會根據具體使用的類型生成相對應的函數。

重載的模版:

需要多個對不同的類型使用同一算法時可使用模版,如上代碼所示。但是并非所有的類型都使用相同的算法。為滿足這種需求,可以像重載常規函數定義那樣重載模版定義。和重載常規函數一樣,重載函數的特征表必須不同。代碼實例如下:

#include <iostream>//模版函數的聲明 template<typename T> void Swap(T& a,T& b);const int iCount = 5; template<typename T> void Swap(T* a,T*b,int n);int main() {int i = 10;int j = 20;std::cout<<"i=" << i << "," << "j=" <<j;Swap(i,j);//生成 void Swap(int &,int&)std::cout<<"i=" << i << "," << "j=" <<j;double x = 11.5;double y = 19.5;std::cout<<"x=" << x << "," << "y=" <<y;Swap(x,y);//編譯器生成 void Swap(double &,double&);std::cout<<"x=" << x << "," << "y=" <<y;int d[iCount] = {0,1,2,3,4};int e[iCount] = {5,6,7,8,9};Swap(d,e,iCount);//匹配新的模版,進行數組的交換return 0; }//模版函數的定義 template<typename T> void Swap(T& a,T& b) {T temp;temp = a;a = b;b = temp; }template<typename T> void Swap(T* a,T*b,int n) {for (int i=0;i<iCount;++i){T temp;temp = a[i];a[i] = b[i];b[i] = temp;} }

如上代碼新增了一個模版,用于交換兩個數組中的元素,原來的模版特征標為(T&,T&),新模版的特征標為(T[],T[]),int)。注意,在后一個模版中,最后一個參數的類型為具體類型(int),而不是通用類型,并非所有的模版參數都必須是模版參數類型。

顯示具體化:

  • 對于給定的函數名,可以有非模版函數,模版函數和顯示具體化模版函數以及它們的重載版本。
  • 顯示具體化的原型和定義應該以template<>打頭,并通過名稱來指出類型。
  • 具體化將覆蓋常規模版,而非模版函數將覆蓋具體化和常規模版。

下面是用于交換Job結構的非模版函數,模版函數和具體化的原型。

void Swap(job &,job&);//非模版函數

template <typename T>

void Swap(T&,T&);//模版函數

template <> void Swap<job>(job&,job&);//顯示具體化函數,其中Swap后的job參數可去掉,則函數簽名為template <> void Swap(job&,job&);

前面指出,如果有多個原型,編譯器在選擇原型時,非模版將優先于顯示具體化和模版版本,而顯示具體化將優先于使用模版生成的版本。

如下面的調用:

double u,v;

Swap(u,v);//使用通用的模版

job a,b;

swap (a,b)//使用顯示具體化版本。

實例化和具體化:

? ??為了進一步了解模版,必須理解術語實例化和具體化。記住,在代碼中包含函數模版本身并不會生成函數的定義,它只是一個用于生成函數定義的方案。編譯器使用模版為特定類型生成定義時,得到的是模版實例(instantiation)。例如:函數調用Swap(i,j),使編譯器生成一個Swap()的一個實例,該實例使用int類型。模版并非函數定義,但使用int的模版實例是函數定義。這種實例化方式被稱為隱式實例化,因為編譯器之所以知道需要定義,是由于程序調用Swap()時提供了int參數。

? ? 現在編譯器還可以允許顯示實例化,這意味著可以直接命令編譯器生成特定的實例,如Swap<int>。其句法是,聲明所選的種類-用<>符號指示類型,并在聲明前加上關鍵字template:

template void Swap<int>(int,int);//顯示實例化

實現了這種特性的編譯器在看到上述聲明后,將使用Swap()模版生成一個int類型的實例。

與顯示實例化不同的是,顯示具體化使用下面兩個等價聲明的之一:

template <> void Swap<int>(int,int);

template <> void Swap(int,int);

區別在于,這些聲明的意思是”不要使用Swap()模版來生成函數定義,而應該使用獨立的、專門的函數定義顯示為int類型生成函數定義。

注意:試圖在一個編程單元中使用同一種類型的顯示具體化與顯示實例化將出錯。

轉載于:https://www.cnblogs.com/mgp200866130/p/6376054.html

總結

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

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