(声明:学习自用,如有错误欢迎指导改正)
C++另一种编程思想称为泛型编程,主要利用的技术就是模板
C++提供两种模板机制:函数模板、类模板
函数模板作用:
1.建立通用函数,其返回值和形参类型不具体给出,用一个虚拟的类型来代表
2.提高函数复用性,将类型参数化
模板函数语法:
template<typename T>
函数声明或定义
解释:
template -----声明创建模板
typename -----表明后面的符号是一种数据类型(可以用class替代)
T ------通用的数据类型,可以替换
#include <iostream>
using namespace std;
template<typename T> //声明一个函数模板,告诉编译器后面的T不要报错,T是一个通用数据类型
T add(T a,T b)
{
return a+b;
}
int main()
{
int x=2;
int y=3;
//使用函数模板——自动类型推导
cout<<"result:"<<add(x,y)<<endl;
//使用函数模板——指定类型
cout<<"result"<<add<int>(x,y)<<endl;
return 0;
}
注意事项:
1.采用自动类型推导方式调用函数模板的话,需要一致的数据类型,即在上面的代码中,传入的x和y类型要一致
2.模板必须确定出T的数据类型才可以使用
#include <iostream>
using namespace std;
template<typename T>
void fun()
{
cout<<"调用fun"<<endl;
}
int main()
{
fun<int>();
return 0;
}
普通函数和函数模板的区别:
1.普通函数调用时可以发生自动类型转换(隐式)
2.函数模板调用时,如果使用自动类型推导,不会发生隐式的自动类型转换
3.如果函数模板利用指定类型的方式,可以发生隐式的自动类型转换
4.函数模板的复用性更高
5.如果函数模板和普通函数都可以实现,优先调用普通函数
#include <iostream>
using namespace std;
template<typename T>
T add(T a,T b)
{
return a+b;
}
int main()
{
int a=2;
int b=3;
char c='c';
cout<<"自动类型推导方式调用函数模板:"<<add(a,b)<<endl; //成功执行,输出结果为5
cout<<"自动类型推导方式调用函数模板:"<<add(a,c)<<endl; //失败,类型不一致,无法发生隐式自动类型转换
cout<<"指定类型方式调用函数模板:"<<add<int>(a,c)<<endl; //成功执行,输出结果为101
cout<<"指定类型方式调用函数模板:"<<add<int>(a,b)<<endl; //成功执行,输出结果为5
return 0;
}