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

   泛型编程是工程开发中必用的技术,在大型公司里面一般都有自己的通用库,而这些通用库都是使用泛型编程来完成的。在C++中支持泛型编程的技术。C++中函数模板和类模板就是使用泛型编程技术。接下来我们就来学习下使用泛型编程技术实现的函数模板。

一、发散性问题

1、 C++中有几种交换变量的方法

(1)定义宏代码块

(2)定义函数

示例:宏代码块VS函数

#include <iostream>
#include <string>

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 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;
}
   
             
int main()
{

   int a = 1;
   int b = 2;
   
   Swap(a,b);
   
   cout << "a = " << a << endl;
   cout << "b = " << b << endl;
   
   double m = 1;
   double n = 2;
   
   Swap(m,n);
   
   cout << "m = " << m << endl;
   cout << "n = " << n << endl;
   
   string t = "Zhang";
   string d = "Ge";
   
   Swap(t,d);
   
   cout << "t = " << t << endl;
   cout << "d = " << d << endl;
   
   return 0;
}

定义宏代码块

优点:代码复用,适合所有类型

缺点:编译器不知道宏的存在,缺少类型检查

定义函数

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

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

二、新的需求

1、C++中有没有解决方案集合两种方法的优点?

答案是肯定的。C++支持泛型编程。

2、泛型编程的概念 

不考虑具体类型的编程方式,只考虑实现的具体功能

对于Swap函数可以考虑下面的泛型写法

void Swap(T& a,T& b)

{
    T t = a;
    a = b;
    b = t;
}

这里的T不是一个具体的数据类型,而是泛指任意的数据类型

3、C++中的泛型编程

(1)函数模板

  •   一种特殊的函数可用不同类型进行调用
  •   看起来和普通函数很相似,区别是类型可被参数化

(2)函数模板的语法规则

template  <typename T>

template<typename T>
void Swap(T& a,T& b)

{
    T t = a;
    a = b;
    b = t;
}
  •  template关键字用于声明开始进行泛型编程

  •  typename关键字用于声明泛指类型

(3)函数模板的使用

  • 自动类型推导调用
  • 具体类型显示调用
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 Println(T a[],int len)
{
   for(int i = 0;i < len;i++)
   {
      cout << a[i] <<",";
   }
   
   cout << endl;
}
       
int main()
{
  int a[5] = {5,4,3,1,2};
  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++中重要的代码复用方式

猜你喜欢

转载自blog.csdn.net/qq_34862658/article/details/81805627