C++】浅谈 模板

简单来说,模板就是一个模具,比如你做蛋糕,我们给这个模具中放入不同的料,最后得到了不同味道的蛋糕。C++中也有这样一个模子,给编译器一个模子,让它根据不同类型利用该模子来生成代码。模板是泛型编程的基础。
模板分为函数模板和类模板

函数模板

代表一个函数家族,与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。函数模板不是真正的函数,是编译器生成代码的规则
格式:
template<typename T1,ytpename T2,..,Typename Tn>
返回值类型 函数名(参数列表)

其中,typename 是定义模板参数的关键字,也可换成class,但不可换成struct

:实现一个通用的加法函数
既然是通用的,那就可以用下模板函数,它就是一个模具呗,我们想两整数相加,两浮点数,都可以,编译器调用模板,对参数类型推导,从而得到结果

template<class T>
T Add(T left, T right)//两个同类型数相加,返回结果自然就是一个类型了,
{
 return left + right;
}

如果两类型不同,但模板参数列表只有一个T,这时就需要实例化了
隐式实例化
让编译器根据实参推演模板参数的实际类型

//在编译期间要推导类型,模板参数列表只有一个T,编译器不知道把T推到成int,还是double,比如像这种Add(1.0,1);
//改正:
Add(1.0,(double)1);//隐式实例化(不是隐式转换哦)

显式实例化
在函数名后的<>中指定模板参数的实际类型

//下面明确指定T的类型为int
Add<int>(1, 2);//尝试隐式类型转换,成功,生成代码,失败则报错

模板参数匹配原则:
1.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数

int Add(int left, int right)
{
 return left + right;
}

template<class T>
T Add(T left, T right)
{
 return left + right;
}
void Test()
{
 Add(1, 2);
Add<int>(1, 2);//调用模板函数
//调用后生成的方法是:int Add<int>(int left,int right),所以与非模板函数不冲突
}

2.对于非模板函数和同名函数模板,如果其他条件相同,在调用时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数,那么将选择模板
3.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

类模板

格式:
template<class T1,class T2,...,class Tn>
class 类模板名
{
//类内成员定义
};
注:类模板名只是一个名字,不是具体的类

用类模板实现顺序表,链接如下
https://blog.csdn.net/weixin_43219708/article/details/104268986

模板大致总结

优点:

  • 模板复用了代码,节省资源,更快的迭代开发,C++的标准库(STL)因此而产生
  • 增强了代码的灵活性

缺点:

  • 模板会导致代码膨胀问题,也会导致编译时间变长
  • 出现模板编译错误时,错误信息非常凌乱,不易定位错误
发布了73 篇原创文章 · 获赞 2 · 访问量 2842

猜你喜欢

转载自blog.csdn.net/weixin_43219708/article/details/104262374