16. C++泛型编程(函数模板)

C++中如何交换两个变量的值?

16. C++泛型编程(函数模板)_第1张图片

你注意到了么?除了类型不同,函数体代码完全相同!!!

C++强调代码复用!那如何解决这个代码冗余的问题呢?

 

泛型编程

泛型编程的概念:不考虑具体数据类型的编程模式。

16. C++泛型编程(函数模板)_第2张图片

C++中,泛型编程是通过函数模板。1. 函数模板是一种特殊的函数可用不同类型进行调用;2. 函数模板看起来和普通函数很相似,区别是类型可被参数化;

16. C++泛型编程(函数模板)_第3张图片

函数模板的语法规则

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

16. C++泛型编程(函数模板)_第4张图片

函数模板的应用
               1. 自动类型推导调用
               2. 具体类型显示调用

16. C++泛型编程(函数模板)_第5张图片

#include 
#include 

using namespace std;

template
void Swap(T& a, T& b)
{
    T t = a;
    a = b;
    b = t;
}

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;
    
    Swap(a, b);
    
    cout<<"a = "<

编译运行结果如下:

16. C++泛型编程(函数模板)_第6张图片

 

通过泛型编程实现不同数据类型的排序算法。

#include 
#include 

using namespace std;

template
void Swap(T& a, T& b)
{
    T t = a;
    a = b;
    b = t;
}

template
void SelectSort(T array[], int length)
{
    for(int i=0; i(array, 5);
    
    for(int i=0; i<5; i++)
    {
        cout<

编译运行结果如下:

16. C++泛型编程(函数模板)_第7张图片

 

函数模板的深入理解

        1. 编译器并不是把函数模板处理成能够处理任意类型的函数;
                2. 编译器从函数模板通过具体类型产生不同的函数;
                3. 编译器会对函数模板进行两次编译;
                          在声明的地方对模板代码本身进行编译;
                          在调用的地方对参数替换后的代码进行编译;

 

当函数模板遇上函数重载会发生什么?函数模板可以像普通函数一样被重载。

       1. C++编译器优先考虑普通函数;
               2. 如果函数模板可以产生一个更好的匹配,那么选择模板;
               3. 可以通过空模板实参列表的语法限定编译器只通过模板匹配;

#include 
#include 

using namespace std;

int Max(int a, int b)
{
    cout<<"int Max(int a, int b)"< b ? a : b;
}

template
T Max(T a, T b)
{
    cout<<"T Max(T a, T b)"< b ? a : b;
}

template
T Max(T a, T b, T c)
{
    cout<<"T Max(T a, T b, T c)"<(a, b)<

编译运行结果如下:

16. C++泛型编程(函数模板)_第8张图片

注:1. 函数模板不允许自动类型转化;2. 普通函数能够进行自动类型转换;

 

多参数函数模板

       函数模板可以定义任意多个不同的类型参数。

16. C++泛型编程(函数模板)_第9张图片

 

多个类型参数的模板可以进行自动类型推导吗?当声明的类型参数为返回值类型时,无法进行自动类型推导。

将返回类型参数声明到第一个参数位置,调用时只需显示声明返回类型参数即可。

16. C++泛型编程(函数模板)_第10张图片

#include 
#include 

using namespace std;


template
RT Add(T1 a, T2 b)
{
    return static_cast(a + b);
}


int main(int argc, char *argv[])
{
    cout<('a', 100.0f)<('a', 100.0f)<

编译运行结果如下:

16. C++泛型编程(函数模板)_第11张图片

 

小结:

        1. 函数模板其实是一个具有相同行为的函数家族;
                2. 函数模板可以根据类型实参对函数进行推导调用;
                3. 函数模板可以显示的指定类型参数;
                4. 函数模板可以被重载;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(c++,C++泛型编程,C++函数模板)