函数模板
所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板(Function Template)。
形式示例:
template<typename T>
void Swap(T *a, T *b)
{
T temp = *a;
*a = *b;
*b = temp;
};
int a = 10,b = 10;
Swap(a,b);
template模板关键字,typename(同class,早起编译器使用) 声明操作类型(也称为类型泛化)。上面的模板格式是一个整体,不可分割
当调用Swap(a,b)时,会发生模板类型推断。注意当编译器无法类型推断时,需要显示指明操作类型(显示具体化),示例如下:
template<typename T1, typename T2> void func(T1 a)
{
T2 b;
}
func(10); //函数调用,编译器报错,无法推断T2类型
func<int, int>(10);//显示指明
下面写几种情况:注意这不是绕口令(怪不得,被人吐槽C艹哈)
1.类模板从类模板派生
2.类模板从模板类派生
3.类模板从普通类派生
4.普通类从模板类派生
5.函数、类、类的成员函数作为类模板的友元
6.函数模板作为类模板的友元
7.函数模板作为类的友元
8.类模板作为类模板的友元
总结一下知识点:
- 万变不离其宗,用自然思维去理解更好,不要局限在编译器怎么解释上面,毕竟作者也不是神【滑稽】
- 类模板是泛化的,使用时需要显示指明参数类型(这时就是模板类了),使用模板类创建的变量叫模板类实例化
- 模板类的静态成员是公用的,但是是同一个类模板产生的不同模板类的实例,每种实例只能共享自己模板类的静态变量
浙公网安备 33010602011771号