考虑如下情况:
交换两个整型变量的值的Swap函数
void Swap(int & x, int & y) {
int tmp = x;
x = y;
y = tmp;
}
交换两个double型变量的值的Swap函数
void Swap(double & x, double & y) {
double tmp = x;
x = y;
y = tmp;
}
模板的写法
template <class 类型参数1, class 类型参数2, ...>
返回值类型 模板名(形参表) {
函数体
};
template <class T>
void Swap(T & x, T & y) {
T tmp = x;
x = y;
y = tmp;
}
模板可以有多个参数
template <class T1, class T2>
T2 print(T1 arg1, T2 arg2) {
cout << arg1 << " " << arg2 << endl;
return arg2;
}
求数组最大元素的MaxElement函数模板
template <class T>
T MaxElement(T a[], int size) {
T tmpMax = a[0];
for(int i = 1; i < size; ++i)
if(tmpMax < a[i])
tmpMax = a[i];
return tmpMax;
}
不通过参数实例化函数模板
- 编译器根据模板生成对应函数的过程叫做实例化
#include <iostream>
using namespace std;
template <class T>
T Inc(T n) {
return 1 + n;
}
void main() {
cout << Inc<double>(4) / 2; // 输出 2.5
}
函数模板重载
函数模板可以重载,只要它们的形参表或类型参数表不同即可template<class T1, class T2>
void print(T1 arg1, T2 arg2) {
cout << arg1 << " " << arg2 << endl;
}
template<class T>
void print(T arg1, T arg2) {
cout << arg1 << " " << arg2 << endl;
}
template<class T, class T2>
void print(T arg1, T arg2) {
cout << arg1 << " " << arg2 << endl;
}
函数模板和函数的次序
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;
}
void main() {
int i = 4, j = 5;
Max(1.2, 3.4); // 输出 MyMax
Max(i, j); // 输出 TemplateMax
Max(1.2, 3); // 输出 TemplateMax2
}
匹配模板函数时,不进行类型自动转换
函数模板示例:Map
```cppinclude
using namespace std; templatevoid Map(T s, T e, T x, Pred op) { for(; s != e; ++s, ++x) {
} }*x = op(*s);
int Cube(int x) { return x x x; } double Square(double x) { return x * x; }
int a[5] = {1,2,3,4,5}, b[5]; double d[5] = { 1.1, 2.1, 3.1, 4.1, 5.1}, c[5]; void main() { Map(a, a+5, b, Square); for(int i = 0; i < 5; ++i) cout << b[i] << “,”; cout << endl;
Map(a, a+5, b, Cube);
for(int i = 0; i < 5; ++i)
cout << b[i] << ",";
cout << endl;
Map(d, d+5, c, Square);
for(int i = 0; i < 5; ++i)
cout << c[i] << ",";
cout << endl;
}
/ 输出:
1,4,9,16,25
1,8,27,64,125
1.21,4.41,9.61,16.81,26.01
/
```