考虑如下情况:

  • 交换两个整型变量的值的Swap函数

    1. void Swap(int & x, int & y) {
    2. int tmp = x;
    3. x = y;
    4. y = tmp;
    5. }
  • 交换两个double型变量的值的Swap函数

    1. void Swap(double & x, double & y) {
    2. double tmp = x;
    3. x = y;
    4. y = tmp;
    5. }

    能否写一个Swap,能交换各种类型的变量?

    模板的写法

  1. template <class 类型参数1, class 类型参数2, ...>
  2. 返回值类型 模板名(形参表) {
  3. 函数体
  4. };
  5. template <class T>
  6. void Swap(T & x, T & y) {
  7. T tmp = x;
  8. x = y;
  9. y = tmp;
  10. }

image.png

模板可以有多个参数

  1. template <class T1, class T2>
  2. T2 print(T1 arg1, T2 arg2) {
  3. cout << arg1 << " " << arg2 << endl;
  4. return arg2;
  5. }

求数组最大元素的MaxElement函数模板

  1. template <class T>
  2. T MaxElement(T a[], int size) {
  3. T tmpMax = a[0];
  4. for(int i = 1; i < size; ++i)
  5. if(tmpMax < a[i])
  6. tmpMax = a[i];
  7. return tmpMax;
  8. }

不通过参数实例化函数模板

  • 编译器根据模板生成对应函数的过程叫做实例化
    1. #include <iostream>
    2. using namespace std;
    3. template <class T>
    4. T Inc(T n) {
    5. return 1 + n;
    6. }
    7. void main() {
    8. cout << Inc<double>(4) / 2; // 输出 2.5
    9. }

    函数模板重载

    函数模板可以重载,只要它们的形参表或类型参数表不同即可
    1. template<class T1, class T2>
    2. void print(T1 arg1, T2 arg2) {
    3. cout << arg1 << " " << arg2 << endl;
    4. }
    5. template<class T>
    6. void print(T arg1, T arg2) {
    7. cout << arg1 << " " << arg2 << endl;
    8. }
    9. template<class T, class T2>
    10. void print(T arg1, T arg2) {
    11. cout << arg1 << " " << arg2 << endl;
    12. }

    函数模板和函数的次序

    image.png
    1. template<class T>
    2. T Max(T a, T b) {
    3. cout << "TemplateMax" << endl;
    4. return 0;
    5. }
    6. template<class T, class T2>
    7. T Max(T a, T2 b) {
    8. cout << "TemplateMax2" << endl;
    9. return 0;
    10. }
    11. double Max(double a, double b) {
    12. cout << "MyMax" << endl;
    13. return 0;
    14. }
    15. void main() {
    16. int i = 4, j = 5;
    17. Max(1.2, 3.4); // 输出 MyMax
    18. Max(i, j); // 输出 TemplateMax
    19. Max(1.2, 3); // 输出 TemplateMax2
    20. }

    匹配模板函数时,不进行类型自动转换

    image.png

    函数模板示例:Map

    ```cpp

    include

    using namespace std; template void Map(T s, T e, T x, Pred op) { for(; s != e; ++s, ++x) {
    1. *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;

  1. Map(a, a+5, b, Cube);
  2. for(int i = 0; i < 5; ++i)
  3. cout << b[i] << ",";
  4. cout << endl;
  5. Map(d, d+5, c, Square);
  6. for(int i = 0; i < 5; ++i)
  7. cout << c[i] << ",";
  8. cout << endl;

} / 输出: 1,4,9,16,25 1,8,27,64,125 1.21,4.41,9.61,16.81,26.01 / ``` image.png