如何实现一个通用的函数呢?(如针对不同的参数类型均可)
在平时的编程中,如何实现一个通用的函数呢?
首先想到的就是使用函数重载,但是这样一来会有几个不好的地方:
- 重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时就需要增加对应的函数
- 代码可维护率比较低,一个函数出错就有可能所有的重载都出错
那么有没有一种方式,使得编译器可以根据不同的类型来利用该模子来生成代码呢?
答案是有的——泛型编程,也就是一种编写与类型无关,与使用场景无关的通用代码,使得代码可以复用的手段,而模板则是泛型编程的基础
模板:
模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
- 模板是一种对类型进行参数化的工具;
- 通常有两种形式:函数模板和类模板;
- 函数模板针对仅参数类型不同的函数;
- 类模板针对仅数据成员和成员函数类型不同的类。
使用模板的目的就是能够让程序员编写与类型无关的代码。比如编写了一个交换两个整型int 类型的swap函数,这个函数就只能实现int 型,对double,字符这些类型无法实现,要实现这些类型的交换就要重新编写另一个swap函数。使用模板的目的就是要让这程序的实现与类型无关,比如一个swap模板函数,即可以实现int 型,又可以实现double型的交换。模板可以应用于函数和类。下面分别介绍。
注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。
函数模板
是一个函数家族,与类型无关,使用时才被参数化,根据实参类型产生函数的适用版本
函数模板格式
template
T1 _Add(T1 left,T2 right) //函数模板
{
return left + right;
}
实例化:
隐式实例化:
编译器根据实参推演模板参数的实际类型
显示实例化:
函数名和后加<>指定参数实际类型
匹配原则:
1.优先调用自己写的模板函数
2.模板函数不允许自动类型转换,普通函数可以自动类型转换
1 |
|
用模板写list类
1 | template<class T> |