函数模板:类型参数化,编写代码可以忽略类型。
#include<iosteam>
using namespace std;
template<class T> //template<typename T> //告诉编译器 下面写模板函数
void MySwap(T& a,T& b){
T temp = a;
a = b;
b = temp;
}
void test()
{
//自动类型推导
int a=10,b=20;
cout<<"a:"<<a<<"b:"<<b<<endl;
MySwap(a,b);
cout<<"a:"<<a<<"b:"<<b<<endl;
double da=1.13,db=1.14;
cout<<"da:"<<da<<"db:"<<db<<endl;
MySwap(da,db);
cout<<"da:"<<da<<"db:"<<db<<endl;
//显示指定类型
MySwap<int>(a,b);
}
int main()
{
test();
return 0;
}
普通函数和模板函数的区别:
普通函数可以进行自动类型转换,模板函数必须严格类型匹配。
#include<iostream>
using namespace std;
template<class T>
T MyAdd(T a,T b){
return a + b;
}
int MyAdd(int a,char c){
return a + c;
}
void test(){
int a=10;
int b=20;
char c1='a';
char c2='b';
MyAdd(a,c1); //调用int MyAdd()
MyAdd(a,b); //调用T MyAdd()
MyAdd(c1,b); //调用int MyAdd()
}
int main(){
test();
}
模板函数和普通函数在一起的调用规则:
①模板函数可以像普通函数那样被重载;
②c++编译器优先考虑普通函数;
③如果函数模板可以产生更好的匹配,那么选择模板;
④可以通过空模板实参列表的语法限定编译器只能通过模板匹配。
调用模板函数时会经过二次编译,第一次编译模板,第二次带入参数类型再次编译。