学习之路:C++模板

什么是模板?模板在生活中用处很大,类似流水线作用,手机外壳的制作等方方面面都离不开模板,如果没有模板,什么东西都是一件一件做出来,效率就很低下。

1.模板函数

在C++中如果我们要实现一个函数类似 swap函数用来交换两个传入的参数的值参数的类型分别为int,long,double,可以考虑用函数的重载,三个函数,因为功能很简单,这里就不写了。
但是这种代码实现的方式十分的臃肿,我们可以考虑用函数模板来重载,
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定
类型版本
格式
template<class T1,class t2,class t3……>
返回值类型 函数名 (参数列表)
{
}
函数重载的具体例子如下:

template<class T>
T Swap( T& a,  T& b)
{
	T tem = a;
	a = b;
	b = tem;
 return 0;
}

注意以下几点

  1. 参数列表里的class可以用typename来替代,但是不能用struct来替代
  2. 注意传入参数的类型,假如传入上面Swap函数里的两个参数类型不同,编译器无法确定用哪个替代T,会报错,除此之外,和普通函数用法相同。
    3.假如有一个模板函数和一个普通同名函数,传递的参数符合,程序会调用普通函数,如果模板函数会产生更符合的函数,会调用模板函数

例如同时存在Swap模板函数和普通Swap函数

template<class T1,class T2>
T Swap( T1& a,  T2& b)
int Swap(int&,int&);
int a,b;
Swap(a,b);//调用普通函数,因为普通函数参数符合
int c;
long d;
Swap(c,d);//调用模板函数,虽然long能隐式转化成int,但是模板函数能产生更符合条件的函数

和普通函数不同,模板函数不允许隐式转化。

2.模板类

有了模板函数,以此类推也有模板类,格式为

template<class T1, class T2, ..., class Tn>
class 类模板名
{
 // 类内成员定义
}

注意1.模板类的每个函数如果在类外实现需要类后加模板参数列表和类模板的声明

template<class T>
T test<T>::Swap(T &a,T& b)
{
	T tem = a;
	a = b;
	b = tem;
	return 0;
}	

注意2:模板类的实例化需要模板类的名字后加是<实例化需要的类型>加对象名字,如↓

test<int>  s1;

模板类并不是真正的类,而是编译器根据需要生成实例类的工具👁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章