模板编程 : 增加代码的通用性, 编写与具体类型无关的通用代码
函数模板
-
template < class / typename 参数1, class / typename 参数2, … >
返回值 函数名 (参数列表) {} -
函数模板不是一个可以执行的函数,只有通过实例化产生的具体类型的函数代码才可以执行
-
函数模板实例化
1 . 隐式实例化 : 编译器根据具体参数进行自动推导,然后根据推导出的具体参数类型生成可执行的代码
2 .显示实例化 : 显示指定需要生成的参数类型 : 函数名<具体参数类型>() -
匹配规则
1 .非模板函数与模板函数共存,优先调用非模板函数,不进行函数模板的实例化
2 .非模板函数与模板函数共存,非模板函数参数类型不能完全匹配实际的参数类型,模板可以实例化一个完全匹配的函数,则进行函数模板的实例化
3 .非模板函数与模板函数共存,但是指定了需要实例化,则无论非模板函数是否匹配,都会进行函数模板的实例化
template <typename T>
void Swap(T* a, T* b)
{
T tmp = *a;
*a = *b;
*b = tmp;
}
template <class T1, class T2>
void Swap(T1* a, T2* b)
{
T1 tmp = *a;
*a = *b;
*b = tmp;
}
template <class T>
T Add(T a, T b)
{
return a + b;
}
类模板
-
template < class / typename 参数1, class / typename 参数2, … >
class 类名{} -
类模板不是一个具体的类,用sizeof求大小无法求出
-
类模板只能显示实例化
-
类模板实例化的具体类 : 类名和类型不同, 类型 = 类名<具体类型>
template <class T>
struct Node2
{
T _a;
T _b;
Node2()
{}
Node2(T a, T b)
:_a(a)
, _b(b)
{}
};
template <class T, class T2, class T3, class T4>
struct Node3
{
T _a;
T _b;
Node3()
{}
Node3(T a, T b)
:_a(a)
, _b(b)
{}
};