模板用于泛型编程
模板类
- 模板定义的函数或者类在编译的时候实例化出来
- 在需要定义为模板的类或函数前加上template< typename T>
- 模板定义过的类名在同一作用域下,无法再次定义为普通类,但是可以特例化为指定类型模板类
- 特例化的模板类的内部结构可以和其对应的模板类内部结构不同,这也是特例化模板类的意义
模板函数
- 模板函数和普通函数可以重名
- 编译器调用,模板函数和普通函数的顺序为:如果有参数类型相同的重载函数,优先调用重载函数,没有重载函数则调用相应模板函数
- 模板函数的实例化方法:根据调用函数的实参的值,来推出模板函数的形参和返回值的类型,完成实例化
#include<string>
#include<iostream>
using namespace std;
template <typename T=char>
class A{
public:
A(){cout<<"模板"<<endl;}
};
template <> //特例化模板1
class A<int>{
public:
A(){cout<<"调用fei模板"<<endl;}
int b;
};
template <> //特例化模板2
class A<string>{
public:
A(){cout<<"调用2模板"<<endl;}
string b;
};
template <typename F2,typename F3>
F2 test(F2 x,F3 y){
cout<<x<<" "<<y<<endl;
return x;
}
void test(){
cout<<"dasd"<<endl;
}
char test(int x,char y){ //函数重载
cout<<x<<"+"<<y<<endl;
return x;
}
int main(){
A<> a;
A<string> b;
A<int> c;
test(8,'d'); //这里优先调用匹配成功的重载函数,
//如果没有匹配成功的重载函数,再调用模板函数
test(8,8);
test();
}
运行结果如下
模板
调用2模板
调用fei模板
8+d
8 8
dasd