模板
顾名思义,就是如果存在同样功能但数据类型不同的函数或者类,分别写出不同的定义很冗余,所以将数据类型用一个记号统一表示(参数化),把这些不同函数(或者不同类)给统一成一个模板,这就是数据类型参数化
函数模板
.h文件
template<typename T> T func1(T a) { //函数功能 }
定义如上,使用template和typename关键字,表示这是一个模板,T代表任意的数据类型
.cpp文件
int main() { int b=0; int a = func1(b); return 0; }
使用如上,函数模板会自动识别类型
类模板
.h文件
template<typename T> class Myclass { public:
Myclass();
T func1(); }
template<typename T>
T Myclass<T>::func1();
定义如上,不同的是,类模板的类函数定义时,类名需要加上<T>
.cpp文件
int main() { Myclass<double> a; }
*模板的定义和实现一般来说一起写在头文件 ,如果分开写则会导致编译不通过。另外一种方法是在实现模板所在的cpp文件进行实例化
如例子:
// 2.h #pragma once template<typename T> T func1(T a, T b); //2.cpp #include "2.h" template<typename T> T func1(T a, T b) { return a + b; } template int func1<int>(int,int); template float func1<float>(float, float); //main.cpp #include<iostream> #include "2.h" int main() { int a = 1, b = 2; float c = 1.0, d = 2.0; int f1 = func1(a, b); float f2 = func1(c,d); return 1; }
主函数用到int和float型的实例,而模板在2.h中定义,在2.cpp中实现,则需要在2.cpp中分别实例化<int>和<float>
template int func1<int>(int,int); template float func1<float>(float, float);