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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++.Templates学习总结归纳1

發(fā)布時(shí)間:2023/12/13 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++.Templates学习总结归纳1 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

函數(shù)模板

首先我們來(lái)看看函數(shù)模板,一個(gè)函數(shù)模板(function template)代表一族函數(shù),其表現(xiàn)和一般的函數(shù)一樣,只是其中的某些元素在編寫(xiě)的時(shí)候還不知道,也就是說(shuō)這些還不知道的元素,我們將其參數(shù)化了。

例如下面的返回兩個(gè)數(shù)中的較大者:

template<class T> inline T const& max(T const& a,T const& b){return a>b?a:b; }

當(dāng)然,上述代碼中的class也可以用typename所代替,但是不能使用struct代替。不過(guò)一般建議使用typename。

舉個(gè)可以實(shí)際運(yùn)行的例子:

#include <iostream> #include <string>template<class T> inline T const& max(T const& a,T const& b){return a>b?a:b; }int main(){std::cout<< ::max(2,1)<<std::endl;std::cout<< ::max(1.12,4.5)<<std::endl;std::string str1="hello";std::string str2="rollen";std::cout<< ::max(str1,str2)<<std::endl;return 0; }

  注意上面使用了::max,是為了和std::max進(jìn)行區(qū)分的。

但是如果試圖使用某一類型的時(shí)候,但是這個(gè)類型中并沒(méi)有定義我們?cè)谀0搴瘮?shù)中所使用的某一些操作的時(shí)候,就會(huì)出現(xiàn)錯(cuò)誤。

std::complex<float> c1,c2;max(c1,c2);

上面的代碼在編譯期間就會(huì)出現(xiàn)錯(cuò)誤。

實(shí)際上,我們的template會(huì)被編譯兩次:

第一次:主要是對(duì)代碼進(jìn)行語(yǔ)法檢查,比如缺少分號(hào),什么的。

第二次: 主要是對(duì)template代碼中所進(jìn)行的操作進(jìn)行檢查,就如同上面的那樣,是否使用了未定義的操作等等。

其實(shí)這樣會(huì)導(dǎo)致一些問(wèn)題的,我們?cè)诤竺娴膬?nèi)容中會(huì)探討這個(gè)問(wèn)題。

template<class T> inline T const& max(T const& a,T const& b){return a>b?a:b; }std::cout<< ::max(2,1)<<std::endl; //編譯器可以推導(dǎo)出是兩個(gè)int std::cout<< ::max(1.12,4.5)<<std::endl; //編譯器可以推到出是兩個(gè)double //std::cout<< ::max(1 , 1.2)<<std::endl; //這條錯(cuò)誤

函數(shù)模板的參數(shù)分為兩種:template parameter和call parameter參數(shù)兩種。比如對(duì)于上面的max代碼,其中的T是template parameter參數(shù),a,b是call parameter參數(shù)。前者的數(shù)量可以是任意的,但是你不能在函數(shù)模板中為他們?cè)O(shè)定初始值,這一點(diǎn)和class template是不一樣的,后面會(huì)提到。

對(duì)于上面代碼中的那一條錯(cuò)誤語(yǔ)句,其實(shí)你可以改為下面的語(yǔ)句:

std::cout<< ::max<double>(1 , 1.2)<<std::endl;

但是如果template parameter和call parameter參數(shù)沒(méi)有明顯的聯(lián)系的時(shí)候,并且編譯器無(wú)法推斷出template parameter的時(shí)候,你就需要明確的指定template argument,例如你可以在max中引入第三個(gè)template argument type 作為返回類型:

template<typename T1,typename T2,typename RT> inline RT max(T1 const& a, T2 const& b);max<int,double,double>(1,2.3);

但是這樣的話,需要在max的尖括號(hào)中寫(xiě)3個(gè)參數(shù),其實(shí)我們至于要改變一些RT的順序,就可以只需要寫(xiě)一個(gè)參數(shù)就行了:

template<typename RT,typename T1,typename T2> inline RT max(T1 const& a, T2 const& b);max<double>(1,2.3);

 在這個(gè)例子中,只要我們明確的指出返回類型,然后編譯器就可以自動(dòng)推斷出a和b的類型;?

關(guān)于模板函數(shù)的重載問(wèn)題:

首先來(lái)看看一個(gè)小例子:

#include <iostream> #include <string> #include <cstring>template<class T> inline T const& max(T const& a, T const& b){std::cout<<"inline T const& max(T a, T b)"<<std::endl;return a>b ? a :b; }template<class T> inline T* const& max(T* a, T* b){std::cout<<"inline T* const& max(T* a, T* b)"<<std::endl;return *a > *b ?a: b; }inline char const* const& max(char const* const& a, char const* const& b){std::cout<<"inline char const* const& max(char const* const& a, char const* const& b)"<<std::endl;return std::strcmp(a,b)<0?b:a; }int main(){int a=1,b=2;::max(a,b);std::string str1="hello";std::string str2="rollen";::max(str1,str2);int* pa=&a;int* pb=&b;::max(pa,pb);char const* s1="hello";char const* s2="rollen";::max(s1,s2);return 0; }

運(yùn)行結(jié)果為:

大家可以注意編譯器優(yōu)先選擇那些特化的模板。

另外建議大家在重載函數(shù)模板的時(shí)候,不同的重載形式之間最好存在絕對(duì)必要的差別,并且請(qǐng)把所有形式的重載函數(shù)寫(xiě)在他們的被調(diào)用點(diǎn)之前。


轉(zhuǎn)載于:https://www.cnblogs.com/rollenholt/archive/2012/03/07/2383475.html

總結(jié)

以上是生活随笔為你收集整理的C++.Templates学习总结归纳1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。