c++ template筆記(1)模板函數

來源:互聯網
上載者:User
文章目錄
  • 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.