c++學習記錄之泛型,函數模板相關,函數模板重載

1.函數模板泛型的實際例子

1.1 隱式推導

即根據傳遞的參數來推導出用什麼類型來替換T

#include <iostream>

using namespace std;

template <typename T>

void Swap(T &a, T &b) 
{
    T temp;

    temp = a;
    a = b;
    b = temp;
}
int main(int argc, char *argv[]) 
{
    int a = 2;
    int b = 3;

    Swap(a, b);

    cout << "a=" << a << ", b=" << b << endl;
    return 0;
}

運行結果

lydia@lydia:~/sgy/c++_learn$ ./test
a=3, b=2

這個T不是一個具體的數據類型,而是泛指任意的數據類型!

1.2 顯式調用

顯式調用int類型的模板

Swap(a,b);

在這裏插入圖片描述

1.3 查看具體調用的是哪一個函數

__PRETTY__FUNCTION__

2. 函數模板的重載

函數模板也可以重載!

下面兩個函數是重載函數!

T add(T &a, T &b);
T add(const T &a, const T &b);
#include <iostream>

using namespace std;

template <typename T>
T add(T &a, T &b)
{
    cout << __PRETTY_FUNCTION__ << endl;
    return a+b;
}

template <typename T>
T add(const T &a, const T &b)
{
    cout << __PRETTY_FUNCTION__ << endl;
    return a+b;
}

int main() 
{
    int a = 1;
    int b = 2;
    cout << add(a, b) << endl;
    return 0;
}

執行的結果!

lydia@lydia:~/sgy/c++_learn/template$ ./test
T add(T&, T&) [with T = int]
3
int main()

2.1 函數模板重載和普通函數匹配的規則

這裏面有三個函數都匹配,但是優先是調用普通函數!

#include <iostream>

using namespace std;

template <typename T>
T add(T &a, T &b)
{
    cout << __PRETTY_FUNCTION__ << endl;
    return a+b;
}

template <typename T>
T add(const T &a, const T &b)
{
    cout << __PRETTY_FUNCTION__ << endl;
    return a+b;
}


int add(int a, int b)
{
    cout << __PRETTY_FUNCTION__ << endl;
    return a+b;
}
int main() 
{
    int a = 1;
    int b = 2;
    cout << add(a, b) << endl;
    return 0;
}

執行的結果!

lydia@lydia:~/sgy/c++_learn/template$ ./test
int add(int, int)
3

匹配的規則

  1. 根據參數轉換,列出所有可能匹配的函數
  2. 選擇最優匹配的函數
    如這裏2,3函數最優
  3. 優先選擇普通函數!
  4. 模板之間選擇最優!如1,2之間選擇 2!
5. T add(const T &a, const T &b)------->int add(const int &a, const int &b)

6. T add(T &a, T &b)------------>int add(int &a, int &b);

7. int add(int a, int b);

類模板泛型的實際例子

在這裏插入圖片描述

在這裏插入圖片描述

類模板的實際例子

#include <iostream>

using namespace std;


template <typename T>

class Op {
public:
    T process(T value)
    {        
        return value * value;
    }
};

int main(int argc, char *argv[]) 
{
    Op<int> opInt;
    Op<double> opDouble;
    int a = 2;
    double d1 = 0.2;
    

    cout << "2 * 2=" << opInt.process(a) << endl;
    cout << "0.2 * 0.2=" << opDouble.process(d1) << endl;

    return 0;
}

執行的結果!

lydia@lydia:~/sgy/c++_learn$ ./test
2 * 2=4
0.2 * 0.2=0.04

總結

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章