1. 程式人生 > >C++函數模板簡介

C++函數模板簡介

-i map 定義類 元素 定義 std space inf color

函數模板(function template):

定義:函數模板不是一個實在的函數,編譯器不能為其生成可執行代碼。定義函數模板後只是一個對函數功能框架的描述,當它具體執行時,將根據傳遞的實際參數決定其功能。

格式:template <class 類型參數1,class 類型參數2,...>

示例:

template <class T>
T Inc(T n) {
    return 1 + n;
}

? 不通過參數實例化函數模板

cout << Inc<double>(4) / 2; //輸出:2.5

? 函數模板可以重載,只要它們的形參表或類型參數表不同
即可。
?函數模板和函數的次序   在多個函數和函數模板名字相同的情況下,編譯器如下處理一條函數調用語句:   1) 先找參數完全匹配的普通函數(非由模板實例化而得到的函數)。   2) 再找參數完全匹配的模板函數   3) 再找實參經過自動類型轉換後能夠匹配的普通函數   4) 上面的都找不到,則報錯   
template <class T>
T Max(T a, T b) {
    cout << "TemplateMax" << endl;
     return 0;
}

template <class T, class T2>
T Max(T a, T2 b) {
    cout 
<< "TemplateMax2" << endl; return 0; } double Max(double a, double b) { cout << "MyMax" << endl; return 0; } int main(void) { int i=4,j=5; Max(1.2,3.4); //output:MyMax Max(i,j); //output:TemplateMax Max(1.2,3); //output:TemplateMax2 return 0; }

? 匹配函數模板時,不進行類型自動轉換

template <class T>
T myFunction(T arg1, T arg2) {
    cout << arg1 <<" "<< arg2 << endl;
    return arg1;
}
...
myFunction(5,8.5);    //error, no matching function for call to ‘myFunction(int, double)‘

? 函數模板示例:Map

  實現把一個數組的某一段指定序列按照自定義類型轉換規則轉換後存到另一數組中。

  

 1 #include <iostream>
 2 using namespace std;
 3 template <class T, class Pred>
 4 void Map(T s, T e, T x, Pred op) {
 5     for(; s != e; ++s, ++x) {
 6         *x = op(*s);
 7     }
 8 }
 9 double Square(double x) {
10     return x*x;
11 }
12 int main(void) {
13     int a[5] = {1,2,3,4,5}, b[5];
14     Map(a, a+5, b, Square);
15     for(int i=0; i<5; i++) {
16         cout << b[i] <<ends;
17     }
18     return 0;
19 }

執行Map(a, a+5, b, Square); 後,實例化以下函數:

  void Map(int * s, int * e, int * x, double (*op)(double)) {
    for(; s != e; ++s, ++x) {
    *x = op(*s);
    }
  }

將a[]中的元素平方後存入b[]中。

2018-01-24


C++函數模板簡介