函数模板

template <typename T1,typename T2>
void isBigger(T1 a,T2 b) {
	return a>b;
}

如果期望函数接受参数类型不固定就可以考虑使用模板

模板函数调用时所有参数类型都要确定, 要么都传进去自动推导,要么调用时显式说明(e.g.模板有三个参数但调用时只传了两个,但我还是想用这个模板)

template <typename T1,typename T2,typename T3>
void isBigger <int,double,int> (T1 a,T2 b) {
	return a>b;
}

类模板

和函数模板类似

template <typename T>
class A {
public:
	T* array;
	int size;
	
	void fun(T* array,int n) {
		this->array = new T[n];
		this->size = n;
		for(int i=0 ; i<n ; i++){
			this->array[i] = array[i];
		}
	}
};
 
int main() {
    double array[]={1.1,2.2,3.3}; 
	A<double> a(array,3);
	return 0;
}

但是类模板不会推导,都要显式说明

对于模板类对象传递到函数中:

  1. 连同模板类型一起声明出来void fun(A <double> a) {}
  2. 直接在把这个函数变成模板函数
template <typename T>
void fun (A <T> a) {}//这样也会自动推导
  1. 既然模板可以替代任意类型,那我直接让它推导 A <double> 类型不就是了
template <typename T>
void fun (T a) {}

模板类继承时要指定模板的类型 class B:public A <double> {};,如果我还是想要不定的类型那就在写一个模板

template <typename U>
`class B:public A <U> {};

类模板的原理

在定义的文件中寻找有没有调用它的地方,有则生成该类或函数

所以一般的函数声明在自己的. h 文件,定义写在自己的. cpp 文件,而类模板得写在同一个. cpp 里

在主函数 cpp 里 #include <xxx.h> 把声明. h文件全部粘贴进来,那么主函数调用时模板就生成实际调用的函数了;如果是把模板函数声明定义分开写会使声明粘贴进主 cpp 但定义 cpp 里的模板因为没有被调用生成不了

所以类模板不要分文件编写,都写. h 里,可以把后缀改成. hpp ,没有太大差别,不过是用来特别说明这个里面是模板