56_函数模板的概念和意义

关键词:泛型编程、函数模板

0. 问题:C++中有几种交换变量的方法?

(1) 定义宏代码块:
优点:代码复用,适合所有的类型
缺点:编译器不知道宏的存在,缺少类型检查
(2) 定义函数
优点:真正的函数调用,编译器对类型进行检查
缺点:根据类型重复定义函数,无法代码复用

1. 泛型编程

  • 概念:不考虑具体数据类型的编程方式
  • 语法规则:
void Swap(T& a, T& b)
{
    T t = a;
    a = b;
    b = t;
}

Swap泛型写法中T不是一个具体的数据类型,而是泛指任意的数据类型

  • 方法:
    (1) 函数模板
    (2) 类模板

2. 函数模板

  • 概念:一种特殊的函数可用不同类型进行调用,看起来和普通函数很相似,区别在于类型可被参数化
  • 语法规则:
template 
void Swap(T& a, T&b)
{
    T t = a;
    a = b;
    b = t;
}

template关键字用于声明开始进行泛型编程
typename关键字用于声明泛型类型

  • 使用方法:
    (1) 自动类型推导调用
int a = 0;
int b = 1;

Swap(a, b);

(2) 具体类型显示调用

double c = 2;
double d = 3;

Swap(c, d);

编程说明:函数模板初探

#include 
#include 

using namespace std;

template < typename T >     // 函数模板
void Swap(T& a, T& b)
{
    T c = a;
    a = b;
    b = c;
}

int main()
{
    int a = 0;
    int b = 1;
    
    Swap(a, b);         // ==> Swap(a, b);
    
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    
    double c = 2;
    double d = 3;
    
    Swap(c, d);         // ==> swap(a, b);
    
    cout << "c = " << c << endl;
    cout << "d = " << d << endl;
    
    string l = "lll";
    string i = "iii";
    
    Swap(l, i);
    
    cout << "l = " << l << endl;
    cout << "i = " << i << endl;
    
    return 0;
}

输出结果

a = 1
b = 0
c = 3
d = 2
l = iii
i = lll

3. 小结

  • 函数模板是泛型编程在C++中的应用方式之一
  • 函数模板能够根据实参对参数类型进行推导
  • 函数模板支持显示的指定参数类型
  • 函数模板是C++中重要的代码复用方式

你可能感兴趣的:(56_函数模板的概念和意义)