考虑如下情况:
交换两个整型变量的值的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); // 输出 MyMaxMax(i, j); // 输出 TemplateMaxMax(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
/
```

