函数模板
1.什么是函数模板
定义:不是一个具体的函数,而是一个通用工具,可以批量生成不同类型的函数
作用:一套代码,支持 int、double、char、类…… 所有类型,不用写重载!(意思就是支持不同数据类型的调用,解决代码重复问题)
泛型:是一种思想,让代码支持多种类型(类型参数化)
函数模板,类模板是C++实现泛型的两种方式
2.语法
template <typename/class 类型参数名>
返回值类型 函数名(参数列表)
{
函数体;
}
-
typename 定义泛型的关键字,T表示一种关键字(泛型的参数)
-
template:声明这是一个模板 -
T:通用类型占位符(可自定义名称,如 T、E、V 等) -
typename关键字还有一个替身 class
//函数模板不要声明和定义分开
//因为函数模板不需要编译,只是调用时才进行实例化
template<typename T>
T add(T a,T b)
{
return a+b;
}
//编译器自动根据实参类型生成对应函数
add(1, 2); // T = int
add(1.1, 2.2); // T = double
add('a', 'b'); // T = char
//也可以手动指定泛型类型
add<int>(1,3);
add<double>(2.2,4.5);
多泛型函数模板
-
<>内部可以定义多个泛型,使用“,”分隔
-
如:<typename T,typename E,typename K>
-
泛型名称可以任意:
T1, T2, T3/T, U, V都可以
//函数模板不要声明和定义分开
template<class T1,class T2,class T3>//函数声明
T3 add(T1 a, T2 b) { return a + b; }//函数定义
int main()
{
// 指定:T1=int, T2=short, T3=long
cout << add<int, short, long>(1, 2) << endl;
cout << add<short, int, char>(41, 7);
return 0;
}
泛型 = 通用的数据类型(泛指类型)
3.函数模板的重载
函数模板的重载:调用时指定不同的泛型(具体化,实例化)
-
函数模板可以构成重载
-
依据:模板参数个数不同 / 函数参数不同
-
调用时:编译器根据实参自动匹配 / 实例化最合适的模板
//一个模板
template<class T>
T add(T a, T b) { return a + b; }
//第二个模板
template<class T1,class T2,class T3>
T3 add(T1 a,T2 b){return a+b;}
//第三个模板,形参个数不同,也构成模板重载
template<class T>
T add(T a,T b, T c){return a+b+c;}
//函数模板也可以构成函数重载
//函数模板的重载:调用时指定不同的泛型(具体化,实例化)
以上三个同名 add,就是函数模板重载


被折叠的 条评论
为什么被折叠?



