函數(shù)模板
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:空間域名、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、嶧城網(wǎng)站維護、網(wǎng)站推廣。
我們可以把函數(shù)模板當做一種特殊的函數(shù),里面的參數(shù)類型可以是任意類型,這樣的話我們就可以減少重復定義,從而讓這個函數(shù)模板自動適應不同的參數(shù)類型,也就是說函數(shù)可以適應多種類型的參數(shù),例如double
、int
或者類什么的。
C++為了實現(xiàn)上面的功能,引入了template
這個概念。我們可以把template當成是一種特殊的類型參數(shù),并且也可以在函數(shù)里當做參數(shù)傳遞,心里面把它當做int
什么的就行了。
使用類型參數(shù)聲明函數(shù)模板的格式如下所示:
template <class identifier> function_declaration; template <typename identifier> function_declaration; // 這里使用了typename 當做聲明類型參數(shù)
上面聲明函數(shù)模板的格式只有一處不同,那就是class
和typename
,在這里其實使用哪一種都沒有區(qū)別,看自己喜歡就行,C++對此也沒有做嚴格的區(qū)分;
為了更好的說明如何使用函數(shù)模板,便在舉一個很形象的例子,那就是一個用來返回較大值的函數(shù),具體寫法如下所示:
template <typename T> T GetMax(T a, T b) return a > b ? a : b;
在上面的短短幾行代碼中我們就創(chuàng)建了一個函數(shù)模板用來獲取兩個數(shù)之間較大的那個數(shù),不難看出T在這里并沒有指明具體的類型,在這我們?nèi)匀豢梢栽谛睦锇阉斪銎胀ㄗ兞刻幚?,返回值也是T。
為了使用我們定義的函數(shù)模板,可以參照統(tǒng)一的函數(shù)模板調(diào)用格式:
function_name<type> (parameters); // type就是具體的類型,例如int、double這些,parameters就是函數(shù)里的參數(shù),也是具體類型
所以,如果我們想要實現(xiàn)獲取兩個整形值里較大的那個,我們可以傳入int這個類型之后調(diào)用GetMax
函數(shù),具體示例如下:
int x = 4; int y = 2; int max = GetMax<int> (x, y); // max = 4
類模板
由于template聲明的類型可以是任意類型,也就是使用的時候傳入具體的類型就行。所以可以參考上面函數(shù)模板的例子構(gòu)造類模板也是一樣的,在使用這個類的時候傳入具體的變量類型就行了。例如下面的類模板定義:
template <typename T> class MyPair{ T value[2]; public: MyPair(T first, T second) { value[0] = first; value[1] = second; } };
類模板的示例代碼中定義一個MyPair
類,用來存儲任意類型的兩個元素,例如double
,char
,int
等,下面我就給出兩個示例,分別存儲double
和int
類型的變量
MyPair<int> myInt(2, 3); // 存儲兩個整型值 MyPair<double> myDouble(2.3, 3.43); // 存儲兩個double值
模板類的成員函數(shù)也可以在類外定義,寫法和函數(shù)模板的寫法是一樣的,具體示例如下所示:
template <class T> class MyPair { T a, b; public: mypair (T first, T second) {a=first; b=second;} T Getmax (); }; template <typename T> T MyPair<T>::Getmax () // 在類外定義函數(shù), 注意前面的寫法和函數(shù)模板寫法一致 { T retval; retval = a>b? a : b; return retval; }
模板特化
如果我們想要為類模板定義一個不同的實現(xiàn)接口,并且要求需要將特定參數(shù)作為參數(shù)傳遞時,那么我們就可以將該模板特化;
為了更好地說明模板特化,還是舉個簡單的例子吧。假設(shè)我們定義一個類mycontainer
,這個類可以存儲一個任意類型的變量,并且這個類還有一個函數(shù)叫做increasement
用來將存儲的類型加一。并且,如果這個類存儲的是一個char類型的時候,我們會發(fā)現(xiàn)這個類對于實現(xiàn)將其中的成員變量轉(zhuǎn)換為大寫的功能將更加方便,不妨將這個函數(shù)定義為ToUpper
,因此,我們可以為char類型的類模板實現(xiàn)模板特化,具體的示例代碼如下:
// 模板特化 #include <iostream> using namespace std; // 聲明類模板: template <typename T> class mycontainer { T element; public: mycontainer (T arg) {element=arg;} T increase () {return ++element;} }; // char類型的模板特化: template <> class mycontainer<char> { char element; public: mycontainer(char arg) {element=arg;} char ToUpper() { if ((element>='a')&&(element<='z')) element+='A'-'a'; return element; } };
對于上面的模板特化,我們需要幾點,注意類模板和模板特化的區(qū)別和聯(lián)系:
template <>
,這表明是模板特化,也就是是說模板特化都需要加上這句話;<char>
參數(shù),這個特定參數(shù)表示我們將模板類特化程<char>
類型;template的其他用法
除了以template
或者class
關(guān)鍵字開頭聲明的表示類型的模板參數(shù)之外,template也可以具有其他類型的參數(shù),例如int
、double
這些參數(shù),就類似于一個函數(shù)中擁有多個參數(shù),每個參數(shù)類型還不一樣。為了更好的說明template
的其他用法,不妨參考下面的示例代碼,
#include <iostream> using namespace std; template<class T, int N> // 這里除了含有class聲明的類型之外,還擁有一個int類型 class mysequence { T memblock [N]; public: void setmember(int x, T value); T getmember(int x); }; template<class T, int N> void mysequence<T,N>::setmember(int x, T value) { memblock[x]=value; } template<class T, int N> T mysequence<T,N>::getmember(int x) { return memblock[x]; } int main(){ mysequence<int,5> myints; mysequence<double,5> myfloats; myints.setmember(0,100); myfloats.setmember(3,3.1416); cout << myints.getmember(0) << '\n'; cout << myfloats.getmember(3) << '\n'; return 0; }
總結(jié)
到此這篇關(guān)于C++總結(jié)之template的文章就介紹到這了,更多相關(guān)C++總結(jié)之template內(nèi)容請搜索創(chuàng)新互聯(lián)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持創(chuàng)新互聯(lián)!
當前名稱:C++中的模板template小結(jié)
本文網(wǎng)址:http://muchs.cn/article42/jcphhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應網(wǎng)站、微信公眾號、外貿(mào)網(wǎng)站建設(shè)、服務(wù)器托管、App設(shè)計、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)