模板從大體上,可以分為兩種:函式模板和類模板。函式模板是演算法庫的基礎,類模板是建立標準庫容器和迭代器的基礎。這一小節我們只介紹函式模板。
個人覺得,模板是c++對c的乙個非常有力的擴充,即使我們不使用物件導向的機制,僅僅寫面向過程的程式,它也是很有用的。因為它可以很大程度上避免了因為引數和函式返回值的型別不確定而引起的函式過載問題。
舉乙個例子,當我們要編寫比大小的函式時,總會碰到這樣的問題:函式形參的型別是不確定的:可以使兩個int比較,也可以是int和double比 較等等。為了能呼叫各種型別的比較,唯一的辦法就是編寫大量的過載函式,讓編譯器自己判斷具體使用哪個。但這樣帶來的問題很多:首先,必須要寫大量的過載 函式;其次對於型別的匹配得非常小心,生怕出錯;最後如果你想將大於變成小於,那麼你的修改所有的過載函式。而有了模板之後,問題就變得簡單多了。
[cpp] view plain copytemplate
int compare(const t1 &v1,const t2 &v2)
2.模板形參的名字不能在模板內部重用:
[cpp] view plain copytypedef
double
t;
template
t foo(
const t &a)
3.我們可以在模板內部定義自己的型別成員:
[cpp] view plain copy//使用迭代器列印容器元素
template void print_by_iter(t&c)
}
這裡面有兩點要注意:首先,呼叫模板的實參型別必須有iterator。其次,最好在定義型別前加上typenme關鍵字告訴編譯器,你指定的是一 個型別。在我們的例子中,不加的話也是能夠順利執行的,但對於有的情況,就必須加上了,比如:t::size_type * p;
這句**就有二義性了:如果size_type是一種型別,那麼這裡應該是宣告了指向乙個型別的指標的型別;如果它是乙個物件,那麼這裡就是在做乘法運算。而編譯器會預設的將它當做物件處理。
4.模板引數不必都是型別,我們也可以定義非型別模板形參。
[cpp] view plain copy//列印陣列
template void printvalue(const t (&parm)[n])
由於函式型別是陣列的引用,所以傳遞給函式的,並不是陣列的首位址,而是把陣列的型別與元素的個數一起當做一種「型別」。其中非型別模板會被常量代替。當模板內部需要時,就能使用了。
最後是幾條關於編寫模板的建議:
1.模板的形參使用const引用。因為使用引用,可以避免那些不能複製的型別不能呼叫模板(比如流),而且如果呼叫模板的物件比較大,那麼可以省去複製的代價。
[cpp] view plain copy//輸出到流
template t1& print(t1&s,t2 val)
那麼可以使用它向任意流中輸出內容:
[cpp] view plain copydouble dval = 0.88
;
float fval = -12.3
;
string oristr = "
this is a test
",desstr;
ostringstream oss(desstr);
ofstream outfile(
"result.dat
");
print(cout,-3
);
print(cout,dval);
print(cout,oristr);
print(outfile,-3
);
print(outfile,dval);
print(outfile,fval);
print(outfile,oristr);
print(oss,-3
);
print(oss,dval);
print(oss,fval);
print(oss,oristr);
cout
《而const則意味著你可以用常量呼叫這個函式:當沒有const時:
[cpp] view plain copy
template
int big(t &a,t &b)
你只能使用:
[cpp] view plain copy
int m = 1
;
int n = 2
; cout
《而如果加上const:int big(const t &a,const t &b)那麼就可以: cout<2.函式體中的測試只用《比較。因為有些型別不一定支援》操作:比如,在我們的比較函式中,使用的是 if(v1v2)。其實,這是一種泛型程式設計的習慣。類似的習慣還有:可以用 「==」或者「!=」判斷時,不用《一樣。比如在for迴圈時,最好使用=!來當條件,而不是小於。
c 函式模板
include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...
c 函式模板
關鍵字template總是放在模板的電腦關於與宣告的最前面,關鍵字後面是用逗號分隔的模板參數列,該列表是模板參數列,不能為空。模板引數可以是乙個模板型別引數,它代表了一種型別 也可以是乙個模板非型別引數,它代表了乙個常量表示式。模板型別引數由關鍵字class或typename後加乙個識別符號構成。在...
C 函式模板
c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...