C++函数模板详解及注意事项

C++函数模板

C++语言引入模板技术,它使用参数化的类型创建相应的函数和类,分别称之为函数模板和类模板,本章介绍函数模板

模板类详解及注意事项请参考:C++模板类详解及注意事项

函数模板:
可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计
意义:对于功能完全一样,只是参数类型不同的函数,能写一段通用代码是用于多种不同的数据类型,会使代码的可重用性大大提高,从而提高软件的开发效率!

函数模板(function template):

定义:函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。
格式:template <class 类型参数1,class 类型参数2,…>

1、函数模板是通用的函数描述

函数模板的声明在关键字template后跟随一个或者多个模板在尖括号内的参数和原型。与普通函数相对,它通常是在一个转换单元里面声明,而在另一个单元中定义,你可以在某个头文件中定义模板

class 和 typename

在这里,class和typename是相同的。也就是说,在声明一个template type parameter(模板类型参数)的时候,class和typename意味着
完全相同的东西。

template与template一般情况下这两个通用,但有一个特例,就是当 T 是一个类,而这个类又有子类(假设名为 innerClass) 时,应该用 template

函数模板定义一般形式如下:

template<类型形式参数>
函数返回类型 函数名(形式参数表)
{
…//函数体
}

定义T作为模板函数,或者是占位符,当实例化函数时,它将替换具体的数据类型。max是函数名,t1和t2是函数的参数,返回值类型是T。

#include <iostream>
using namespace std;
template<class T>                 //函数模板定义
T Max(T x, T y)
{
    return x > y ? x : y;
}
int main(void)
{
    int n = 1, m = 2, max;
    max = Max(n, m);  //编译器自动生成 int Max (int , int )函数
    cout << "n和m中最大的值为:" << max << endl;

    double f = 1.2, g = 2.3, max2;
    max2 = Max(f, g);  //编译器自动生成 double Max (double , double )函数
    cout << "f和g中最大的值为:" << max2 << endl;
    return 0;
}
/*
该函数可以匹配Max(n, m); 这条语句。于是编译器就自动用 int 替换 Max 模板中的 T,生成上面的 Max 函数,

将该 Max 函数的源代码加入程序中一起编译,并且将Max(n, m); 编译成对自动生成的 Max 函数的调用。

同理,编译器在编译到Max(f, g); 时会用 double 替换 Max 模板中的 T,自动生成以下 Max 函数

double Max(double  x, double  y)
{
    return x > y ? x : y;
}
*/

运行结果图:
在这里插入图片描述

注:#define宏定义是编译指令可以在预编译器对代码进行替换

上述代码也可以使用宏定义来实现,但宏定义#define只是进行简单替换,它无法对类型进行检查,有时结果可能不是预计的。
请看下面例子:

#include <iostream>
#define max(a,b) ((a>b)?(a):(b)) 
using namespace std;

int main(void)
{
    int  m = 0, n = 0;
    cout << max(n, ++m) << endl;
    cout << n << endl;
    return 0;
}

运行结果图:
在这里插入图片描述

模板函数和#define宏定义相似,但模板函数是用模板实例化得到的函数,它与普通函数没有本质区别,可以重载模板函数。

整型数和实型数编译器可以直接进行比较,所以使用函数模板后也可以直接进行比较,但如果是字符指针指向的字符串该如何比较呢?
答案是通过重载函数模板来实现。通常字符串需要库函数来进行比较,通过重载函数模板实现字符串的比较。

#include <iostream>
#include<cstring>
using namespace std;
template <class T>             //模板函数
T Max(T t1, T t2)
{
    return t1 > t2 ? t1 : t2;
}

char* Max(char* t1, char* t2)    //重载函数
{
    if (strcmp(t1, t2) > 0)
        return t1;
    else
        return t2;
}
int main(void)
{
    cout << "这两个参数中值最大的是:" << max(10, 100) << endl;
    cout << "这两个参数中值最大的是:" << max("BBB", "AAA") << endl;
    return 0;
}

运行结果图:
在这里插入图片描述

C++模板的一些注意事项

1、模板的定义和声明最好不要放在不同地方

模板在定义时即使用,要像其他普通函数或类在.h中声明,.cpp中定义的话,很可能出现问题(一般是不可行的,但好像有些解决办法):

模板类编译过程中出现“undefined reference to”的问题,参见:
www.baidu.com

2、模版不支持在局部函数中声明定义或使用。

3、模板非类型形参

模板除了定义类型参数,还可以在模板定义非类型参数。

本篇到此结束,如果您发现有什么不对的地方或者有什么需要添加的内容请在评论区留言或直接加我qq: 846581636
期待你的关注~
群内有各种学习资料,欢迎大家一起来学习~
如果大家遇到什么问题也欢迎大家进群讨论哦~
qq群:759252814
感谢大家的支持,谢谢!

猜你喜欢

转载自blog.csdn.net/LYXlyxll/article/details/107946278