函数模板的概念和意义

  • 思考问题:C++中有几种交换变量的方法?
  • 交换变量的方法
      1)定义宏代码块
        优点:代码复用,适合所有的类型。
        缺点:编译器不知道宏的存在,缺少类型检查。
#define SWAP(t, a, b)    \
do                           \
{                             \
    t c = a;                 \
    a = b;                   \
    b = c;                   \
}while(0)
     2)定义函数
        优点:真正的函数调用,编译器对类型进行检查。
        缺点:根据类型重复定义函数,无法代码复用。
void Swap(int& a, int& b)
{
    int c = a;
    a = b;
    b = c;
}
void Swap(double& a, double& b)
{
    double c = a;
    a = b;
    b = c;
}
void Swap(string& a, string& b)
{
    string c = a;
    a = b;
    b = c;
}
  • 新的需求:C++中有没有解决方案集合两种方法的优点?
  • 泛型编程的概念:
//不考虑具体数据类型的编程方式,对于Swap函数可以考虑下面的泛型写法。
void Swap(T& a,T& b)
{
    T c = a;
    a = b;
    b = c;
}
//Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意得数据类型
  • C++中的泛型模板:函数模板
  1. 一种特殊的函数可用于不同类型进行调用
  2. 看起来和普通函数很相似,区别是类型可被参数化
template <typename T>
void Swap(T& a, T& b)
{
    T c = a;
    a = b;
    b = c;
}
  • 函数模板的语法规则
  1. template关键字用于声明开始进行泛型编程
  2. typename关键字用于声明泛型类型
  • 函数模板的使用
  1. 自动类型推导调用
  2. 具体类型显示调用
int a = 0;
int b = 1;
Swap(a,b);  //自动推导
 
float c = 2;
float d = 3;
Swap<float>(c,d); //显式调用
  • 范例程序
#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 printflen(T a[],int len)
{
    for(int i = 0;i < len;i++)
    {
        cout <<a[i]<< ",";
    }
}
 
int main()
{
    int a[6] = {5,3,6,4,1,2};
    double b[5] = {1.2,3.2,0.1,4.3,2.3};
    printflen(a,6);
    cout << endl;
    printflen(b,5);
    Sort(a,6);
    Sort(b,5);
    cout << endl;
    printflen(a,6);
    cout << endl;
    printflen(b,5);
    return 0;
}
  • 运行结果
  • 小结
  1. 函数模板是泛型编程在C++中的应用方式之一
  2. 函数模板能够根据实参对参数类型进行推导
  3. 函数模板支持显式指定参数类型
  4. 函数模板是C++中重要的代码复用方式
 
 
 
 
 
 
 
 
posted @ 2020-02-06 17:43  认真做个普通人  阅读(699)  评论(0编辑  收藏  举报