文章目錄
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
匹配的規則
- 根據參數轉換,列出所有可能匹配的函數
- 選擇最優匹配的函數
如這裏2,3函數最優 - 優先選擇普通函數!
- 模板之間選擇最優!如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