第五十六课、函数模板的概念和意义

一、交换变量的方法

1、定义宏代码块

(1)、优点:代码复用,适合所有的类型

(2)、缺点:编译器不知道宏在哪,缺少类型检查

2、定义函数

(1)、优点:真正的函数调用,编译器对类型进行检查

(2)、缺点:根据类型重复定义函数,无法代码复用

#include<iostream>


using namespace std;

#define SWAP(t, a, b)    
do                       
{                        
    t c = a;             
    a = b;               
    b = c;               
}while(0)
          
void swap(int& a, int& b)
{
    int i = a;
    a = b;
    b = i;
}

/*
void swap(double& a, double& b)
{
    int i = a;
    a = b;
    b = i;
}
*/
int main()
{
    int a = 1;
    int b = 2;
    
    swap(a, b);
    cout << "swap(a, b):" << a << "," << b << endl;// 输2,1
    
    SWAP(int, a, b);
    cout << "SWAP(int, a, b):" << a << "," << b << endl;//输出1, 2
    
    
    return 0;
}

二、泛型编程与函数模板

1、泛型编程的概念:不考虑具体类型的编程方式

2、c++中的泛型编程:函数模板

(1)、一种特殊的函数可用不同的类型来调用

(2)、看起来和普通函数很类似,区别是类型可被参数化

3、函数模板的语法规则

(1)、template关键字用于声明开始进行泛型编程

(2)、typename关键字用于声明泛指类型

4、函数模板的使用

(1)、自动推导调用

(2)、具体类型显示调用

#include <iostream>
#include <string>

using namespace std;

template < typename T >
void Swap(T& a, T& b)
{
    T c = a;
    a = b;
    b = c;
}

template < typename T >
void Sort(T a[], int len)
{
    for(int i=0; i<len; i++)
    {
        for(int j=i; j<len; j++)
        {
            if( a[i] > a[j] )
            {
                Swap(a[i], a[j]);
            }
        }
    }
}

template < typename T >
void Println(T a[], int len)
{
    for(int i=0; i<len; i++)
    {
        cout << a[i] << ", ";
    }
    
    cout << endl;
}

int main()
{
    int a[5] = {5, 3, 2, 4, 1};
    
    Println(a, 5);
    Sort(a, 5);
    Println(a, 5);
    
    string s[5] = {"Java", "C++", "Pascal", "Ruby", "Basic"};
    
    Println(s, 5);
    Sort(s, 5);
    Println(s, 5);
    
    return 0;
}

三、小结

(1)、函数模板是泛型编程在c++中的应用方法之一(还有类模板等)

(2)、函数模板能够根据实参对参数类型进行推导

(3)、函数模板支持显示地指定参数类型

(4)、函数模板是c++中重要的代码复用方式

 

原文地址:https://www.cnblogs.com/gui-lin/p/6373730.html