一,函数模板
1.基础概念
模板编程是C++中泛型编程的基础。
一个模板可以是创建类或者函数的蓝图。
模板编程分两种,分别是算法抽象的模板、数据抽象的模板。算法抽象的模板以函数模板为主,数据抽象的模板以类模板为主。
基于函数模板生成的函数定义被称为模板的一个实例。
模板的定义以关键字template开始,后跟一个由尖括号"<>"括起来的模板参数列表。
2.函数模板的简单样例
函数模板的开头:template
定义模板参数的关键字:typename
模板参数样例:T1, T2
函数参数样例:a, b
template <typename T1, typename T2>
void func(T1 a, T2 b)
{
//process code
}
补充:在C++98标准添加关键字typename之前,C++也可以使用关键字class来为函数模板创建模板参数列表。
代码样例:
template <class T>
void Swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
3.函数模板的实例化
函数模板的实例化是指,编译器根据函数模板和具体的数据类型生成函数定义。
函数模板在实例化以后,模板参数会变成具体的数据类型,比如int, char等。
对于某一种具体的数据类型,比如int,无论以这个数据类型调用多少次函数模板,最后只生成一次该类型的模板实例。
所以,对于相同的数据类型,第一次调用函数模板的时候才会生成实例,后面再次调用的时候,都是直接使用该实例。
当编译器遇到一个函数模板的定义时,并不会马上生成相关代码,只有当我们将函数模板实例化成一个函数定义时,编译器才会生成代码。
代码样例:
a.函数模板
template <typename T>
T add(T num1, T num2) {
return (num1 + num2);
}
b.函数模板的实例化
int result1 = add<int>(2, 3);
double result2 = add<double>(2.2, 3.3);
实例化过程的图示: