文章目錄
- 1.定義函數模板
- 2.使用模板函數
- 3.確定返回的參數
- 4.多個模板參數
- 5.模板函數重載
- 6.字串重載的例子
- 7.總是把重載函數定義在調用之前
- 8.std:string和char
- 9.以非引用參數方式傳遞
1.定義函數模板
template <typename T>inline T const& max (T const& a, T const& b){ // if a < b then use b else use a return a < b ? b : a;}
2.使用模板函數
#include <iostream>#include <string>#include "max.hpp"int main(){ int i = 42; std::cout << "max(7,i): " << ::max(7,i) << std::endl; double f1 = 3.4; double f2 = -6.7; std::cout << "max(f1,f2): " << ::max(f1,f2) << std::endl; std::string s1 = "mathematics"; std::string s2 = "math"; std::cout << "max(s1,s2): " << ::max(s1,s2) << std::endl;}
輸出結果
3.確定返回的參數
::max<double>(1,2); //ok //::max(1,1.2);//wrong ::max(static_cast<double>(4),4.1);//ok
若兩個參數不正確,或者不支援模板定義的特性,編譯時間則會出錯
4.多個模板參數
template <typename T1,typename T2>inline T1 const& max (T1 const& a, T2 const& b){ // if a < b then use b else use a return a < b ? b : a;}
樣本
double i = 42.1;std::cout << "max(7,i): " << ::max(7,i) << std::endl;
傳回值是T1,所以返回是int類型,結果是42,出錯了
定義3個參數,第3個參數用於表示傳回值類型
template <typename T1,typename T2,typename T3>inline T3 const& max (T1 const& a, T2 const& b){ // if a < b then use b else use a return a < b ? b : a;}
測試
double i = 42.1;std::cout << "max(7,i): " << ::max<int,double,double>(7,i) << std::endl;
返回正確的42.1
5.模板函數重載
// maximum of two int valuesinline int const& max (int const& a, int const& b) { return a < b ? b : a;}// maximum of two values of any typetemplate <typename T>inline T const& max (T const& a, T const& b){ return a < b ? b : a;}// maximum of three values of any typetemplate <typename T>inline T const& max (T const& a, T const& b, T const& c){ return ::max (::max(a,b), c);}int main(){ ::max(7, 42, 68); // calls the template for three arguments ::max(7.0, 42.0); // calls max<double> (by argument deduction) ::max('a', 'b'); // calls max<char> (by argument deduction) ::max(7, 42); // calls the nontemplate for two ints ::max<>(7, 42); // calls max<int> (by argument deduction) ::max<double>(7, 42); // calls max<double> (no argument deduction) ::max('a', 42.7); // calls the nontemplate for two ints}
特別注意::max<>(7, 42);這句的寫法
注意:自動類型轉換
::max('a', 42.7); 只適用於常規函數,'a’會完成自動類型轉換
6.字串重載的例子
#include <iostream>#include <cstring>#include <string>// maximum of two values of any typetemplate <typename T>inline T const& max (T const& a, T const& b){ return a < b ? b : a;}// maximum of two pointerstemplate <typename T>inline T* const& max (T* const& a, T* const& b){ return *a < *b ? b : a;}// maximum of two C-stringsinline char const* const& max (char const* const& a, char const* const& b){ return std::strcmp(a,b) < 0 ? b : a;}int main (){ int a=7; int b=42; ::max(a,b); // max() for two values of type int std::string s="hey"; std::string t="you"; ::max(s,t); // max() for two values of type std::string int* p1 = &b; int* p2 = &a; ::max(p1,p2); // max() for two pointers char const* s1 = "David"; char const* s2 = "Nico"; ::max(s1,s2); // max() for two C-strings}
注意每個重載函數必須存在著一定的差異.
7.總是把重載函數定義在調用之前
// maximum of two values of any typetemplate <typename T>inline T const& max (T const& a, T const& b){ return a < b ? b : a;}// maximum of three values of any typetemplate <typename T>inline T const& max (T const& a, T const& b, T const& c){ return max (max(a,b), c); // uses the template version even for ints} // because the following declaration comes // too late:// maximum of two int valuesinline int const& max (int const& a, int const& b) { return a < b ? b : a;}
3參數的max調用的是2參數模板函數,而非最後定義的max非模板函數
8.std:string和char
#include <string>// note: reference parameterstemplate <typename T>inline T const& max (T const& a, T const& b){ return a < b ? b : a;}int main(){ std::string s; ::max("apple","peach"); // OK: same type ::max("apple","tomato"); // ERROR: different types ::max("apple",s); // ERROR: different types}
“apple”會被轉成 char[6]數組,所以比較要求數組維度長度相同,第二條”tomato”與”apple”長度不符合,即出錯.
s是std:: string類型,而非char數組,所以也出錯
9.以非引用參數方式傳遞
#include <string>// note: nonreference parameterstemplate <typename T>inline T max (T a, T b){ return a < b ? b : a;}int main(){ std::string s; ::max("apple","peach"); // OK: same type ::max("apple","tomato"); // OK: decays to same type ::max("apple",s); // ERROR: different types}
只有最後類型不符合的編譯不通過
轉自:http://www.cnblogs.com/Clingingboy/archive/2011/03/08/1977140.html