亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【c++】函數模板

2019-11-14 12:46:36
字體:
來源:轉載
供稿:網友

何為泛型編程呢?簡單的說就是,我們按照特定語法寫代碼,然后讓編譯器去具體實現這些代碼。而函數模板,就是讓編譯器按照調用時的實參自動生成相應的函數版本.

定義和使用函數模板

格式如下:

template<typename AnyType>returnType functionName(argument-list){// do something}

其中templatetypename是關鍵字。

Tips: 在c++98之前c++是使用class關鍵字來定義模板的,而在c++98開始使用typename關鍵字定義模板了。 示例: 現在假設我們想寫一個swap函數來交換兩個數的值

#include <iostream>#include<cstring>#include"test_h.h"using std::string ;using std::cout;using std::endl;//function declaration template<typename T>void swap(T& a,T& b);int main(int argc, char** argv) { int i1=19; int i2=20; double d1=19.0; double d2=20.0; cout<<i1<<endl; cout<<i2<<endl; cout<<d1<<endl; cout<<d2<<endl; cout<<"after transform"<<endl; swap(i1,i2); swap(d1,d2); cout<<i1<<endl; cout<<i2<<endl; cout<<d1<<endl; cout<<d2<<endl;}//function definition template<typename T>void swap(T& a,T& b){ T temp; temp=a; a=b; b=temp;}

編譯器會根據swap()中的參數類型自動生成int和double版本的函數。

Node: 記住template在定義和聲明中都是不能少的

模板函數使用的局限性

假設有如下模板

template<typename T>void f(T a,T b){//……}

如果a,b是數組的話a=b是不可以的 如果a,b是結構的話a>b也是不可以的 所以模板編程有時候你要考慮一下參數的特殊性。這時候我們就要用到顯示具體化

函數模板顯式具體化

格式如下:

template <>returnTyoe function< Type>(Type, Type)

其中template <>為關鍵字,如果編譯器可以根據參數列表推斷模板類型那么< Type>中的Type為可選項

示例:

void swap(int a,int b);template <>void swap(double, double);template<typename T>void swap(T, T);

上賣弄三種分別為非模板函數,模板的顯式具體化,模板函數

如果程序中同時定義了三種函數,會優先調用非模板函數,然后模板的顯式具體化,最后模板函數

函數實例化

一開始定義的模板函數swap(T a,T b)它會告訴編譯器生成函數的方式,但是還沒有生成函數,而當調用swap(i1,i2)和swap(d1,d2)時就會生成相應的模板實例。模板的顯式具體化也一樣都是不會生成函數實例的,而是出現了具體類型之后再讓編譯器按照模板具體化創建函數實例。

在以前c++只能通過判斷函數參數來實例化函數,這種叫做隱式實例化而現在的c++可以通過顯式實例化了,格式如下

template returnType function<Type>(Type,Type);

上面的代碼告訴編譯器創建一個接受Type類型函數的實例,其中template為關鍵字,必須要寫的。 示例:

template void swap<int>(int,int);//函數實例化template<> void swap<int>(int,int);//模板具體化

上面的實例化告訴編譯器使用swap模板生成一個接受int參數的函數實例 而模板顯式具體化,告訴編譯器當調用函數時如果參數為int時,就按照模板具體化定義的形式創建函數。

除了上面的顯示實例化的手段,我們還可以在程序中使用函數來創建顯示實例化,如下

template<typename T>void swap(T a,T b){ T temp; temp=a; a=b; b=temp;}……int i=19;double d=19.0;cout<<swap<double>(i,d)<<endl;//fun(Type)來顯示創建函數實例

上賣弄的模板函數與swap(i,d)是不匹配的,因為兩個參數是不同的,但是通過顯式實例化swap(i,d)來用模板 swap(T a,T b)創建double版本的函數,然后int的值會自動轉換為double,以便函數使用

函數模板的調用

當同時有非模板函數,模板函數,模板顯示具體化時定義時。會優先調用非模板函數,然后模板的顯示具體化,最后模板函數

void f(int); //#1 float f(float,float=3); //#2 void f(char) //#3 char * f(const char *) //#4 char f(const chat *) //#5 template <class T>void f(const T &) //#6 template <class T>void fT *) //#7

如果調用 f('B') 上面#3,#5,#6都是原型匹配,但是#3,#5優先于#6,#6優先于#1

decltype

template<typename T>void f(T a,T b){ ab=a+b;//ab是什么類型的呢?}

所以c++11引入了關鍵字decltype來解決這個問題

int x;decltype(x) y;//y is intdecltype(x+y) xy;//xy is x+y typexy=x+y;decltype(x+y)xy=x+y;//xy is x+y type

上面是三種decltype的簡單使用。而對于如下標準格式 decltype(exPRession) var; 編譯器會編譯一個核對表,核對表的簡化版如下 第一步:如果expresssion是一個沒有用括號的標識符,則var的類型與該標識符相同,包括const等修飾符

double x=19.0;double y=19.0double &rx=x;const double *pd;decltype (x) w;//w is doubledecltype (rx) u;//u is double &decltype (pd) v ;//v const double *

第二步:如果experssion是一個函數調用,var是的類型與函數返回值一樣

int f(int);decltype( f(3)) m//m is int

Note: 這實際不會調用函數,編譯器會根據函數原型判斷返回值類型 第三步:如果expression是一個左值,則var為指向類型的引用。這好像意味著前面w應為引用類型,因為x是一個左值,但是這種情況下已經在第一步處理過了。要進入第三步expression不能是未用括號括起來的標識符

double xx=19.0;decltype((xx))r2=xx;//r2 is double &devltype(xx)w=xx//w is double

第四步:如果前面條件都不滿足,則var的類型與expression類型相同

int j=3;int& k=j;int& n=j;decltype(j+6) i1;//i1 is intdecltype(100L) i2;//i2 is longdecltype(k+n) i3;//i3 is int

c++11后置返回類型

template<typename T>Type f(T a,T b){ return a+b;//a+b的返回上什么類型呢?}

decltype (a+b) 不行嗎?因為這時候還沒有定義a,b,編譯器不知道a,b是什么。c++11為auto新增了語法功能來解決這個問題,如下 auto f(int i1,int i2)->double; auto告訴編譯器返回類型在后面寫著。他可以和decltype 連用 auto f(int i1,int i2)->decltype(x+y);

這樣就完成了返回類型的自動換了。


上一篇:jquery 事件小結

下一篇:jquery 事件小結

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性欧美长视频免费观看不卡| 久久av红桃一区二区小说| 久久久精品2019中文字幕神马| 秋霞成人午夜鲁丝一区二区三区| 久久综合网hezyo| 国产伦精品一区二区三区精品视频| 中文字幕精品在线视频| 欧美在线视频网站| 蜜臀久久99精品久久久无需会员| 久久中文精品视频| 午夜精品视频在线| 国产美女高潮久久白浆| 国产91色在线| 国产+成+人+亚洲欧洲| 国产日韩精品一区二区| 国精产品一区一区三区有限在线| 蜜臀久久99精品久久久久久宅男| 欧美日韩成人在线播放| 亚洲成在人线av| 国产日韩欧美成人| 青青草精品毛片| 国产综合久久久久久| 国产91对白在线播放| 国产成人97精品免费看片| 欧美成在线视频| 欧美亚洲国产日韩2020| 国产精品成av人在线视午夜片| 成人福利免费观看| 国产精品欧美一区二区三区奶水| 日韩欧美国产成人| 国产在线观看不卡| 亚洲一区二区免费在线| 精品偷拍各种wc美女嘘嘘| 欧美情侣性视频| 亚洲电影第1页| 亚洲黄色在线观看| 欧美精品在线观看| 欧美大人香蕉在线| 亚洲精品一区二区三区不| 51ⅴ精品国产91久久久久久| 欧美一级黑人aaaaaaa做受| 日韩美女在线播放| 97**国产露脸精品国产| 青青精品视频播放| 欧美性高跟鞋xxxxhd| 久久影院资源网| 久久成人国产精品| 亚洲国产精品成人精品| 91精品国产成人| 97精品伊人久久久大香线蕉| 国产视频久久久久| 亚洲影院色在线观看免费| 亚洲欧美一区二区三区久久| 亚洲国产黄色片| 欧美在线观看一区二区三区| 国产成人精品一区二区在线| 精品久久中文字幕| 97超碰国产精品女人人人爽| 亚洲视频在线免费观看| 亚洲缚视频在线观看| 亚洲国产日韩欧美在线图片| 国产有码在线一区二区视频| 久久99视频免费| 国产美女主播一区| 久久偷看各类女兵18女厕嘘嘘| 国产精品va在线播放| 亚洲天堂影视av| 国产在线观看精品一区二区三区| 国产日韩换脸av一区在线观看| 91视频免费在线| 亚洲第一国产精品| 亚洲国产欧美一区| 欧美精品一本久久男人的天堂| 欧美激情精品久久久久久变态| 欧美日韩中文字幕日韩欧美| 日韩欧美在线第一页| 亚洲精品天天看| 久久国产天堂福利天堂| 久久韩国免费视频| 亚洲影院色在线观看免费| 国产精品视频免费在线观看| 狠狠躁夜夜躁人人躁婷婷91| 欧美日韩午夜激情| 亚洲天堂精品在线| 45www国产精品网站| 在线播放国产一区中文字幕剧情欧美| 高清欧美性猛交xxxx黑人猛交| www.亚洲一二| 亚洲精选中文字幕| 亚洲影院色在线观看免费| 亚洲欧美一区二区三区情侣bbw| 国产精品美女久久久免费| 亚洲日韩中文字幕在线播放| 日韩女优人人人人射在线视频| 欧美日韩国产一中文字不卡| 亚洲视频在线播放| 久久久精品久久久久| 日韩精品亚洲元码| 亚洲综合中文字幕在线| 国产精品日韩精品| 亚洲电影在线观看| 成人看片人aa| 日韩综合视频在线观看| 亚洲欧美另类自拍| 91精品国产91久久| 一本一本久久a久久精品牛牛影视| 日韩毛片在线观看| 日本亚洲欧洲色| 色综合伊人色综合网站| 在线观看日韩欧美| 亚洲女人天堂网| 精品国产福利在线| 色哟哟入口国产精品| 伊人av综合网| 亚洲欧美精品伊人久久| 一本大道香蕉久在线播放29| 一区二区三区日韩在线| 欧美激情xxxx| 欧美日韩精品中文字幕| 国产欧美一区二区三区久久人妖| 亚洲视频在线观看视频| 日韩欧美在线第一页| 91免费国产视频| 亚洲一区av在线播放| 国产精品香蕉av| 日韩av黄色在线观看| 精品国产91久久久久久老师| 亚洲第一区中文99精品| 久久久久久久一区二区| 日韩欧美中文字幕在线观看| 欧美日韩中文在线观看| 最近日韩中文字幕中文| 精品在线观看国产| 国产91色在线| 欧美成人三级视频网站| 欧美日韩久久久久| 海角国产乱辈乱精品视频| 亚洲成人激情视频| 中文字幕不卡av| 久久久91精品国产一区不卡| 欧美日韩亚洲精品一区二区三区| 欧美国产日韩一区二区在线观看| 51精品在线观看| 精品福利在线看| 97视频免费看| 日韩av在线精品| 九九热r在线视频精品| 亚洲国产女人aaa毛片在线| 色综合色综合久久综合频道88| 久久久精品2019中文字幕神马| 国产精品久久久久免费a∨大胸| 久久久精品在线观看| 九九热最新视频//这里只有精品| 国产精品久久国产精品99gif| 亚洲色图激情小说| 国产精品丝袜视频| 欧美猛少妇色xxxxx| 奇米四色中文综合久久| 国模私拍一区二区三区| 久久精品福利视频| 亚洲性日韩精品一区二区| 亚洲欧美制服第一页| 国产精品视频专区| 亚洲人精品午夜在线观看|