C++模板template

文章介绍了C++中的模板功能,包括如何使用函数模板实现不同类型的变量交换,解决了函数重载的问题。同时,通过类模板的示例,解释了如何避免编写重复代码以适应不同数据类型的存储需求,如Stack类的实例化。文章强调了显示实例化在解决模板实例化不明确问题时的重要性。
摘要由CSDN通过智能技术生成

我们现在有几个变量,我们向要实现他们的交换,所以我们现在写了一个swap函数

 

我们现在可以实现对这两个变量之间的交换, 那么我们有有两个变量需要交换呢??

我们刚才的Swap函数的参数是int类型的,我们现在的两个变量是double类型的,那么我们想要交换double类型的函数可以吗?   不可以

 

但是由于我们的是C++可以实现函数重载,所以我们还可以写一个和刚才的swap函数逻辑完全相同的一个参数为double的函数

 

这下我们有了double类型的Swap函数,我们这下就可以实现刚才的double类型的变量交换了,但是我们有两个逻辑完全相同的函数,仅仅是参数不同,那么我们是比较不舒服的,所以我们在C++中还有一个语法就是模板

函数模板 

下面我们来看一下函数模板

函数模板是什么呢?? 我们拿刚才的Swap函数举例来说,如果我们向实现可以交换任意类型的Swap函数,那么我们应该怎么做呢? 如果我们把所有需要都类型都写一遍那么代码就太冗余了,所以我们不可以这样,下面我们来说一下怎么做

我们来看一下,我们的template就是模板,然后我们的template后面的<>(尖括号),里面是模板参数

 

我们的函数模板后面的类型,除了可以用class 还可以使用typename,而这个T,就是我们的函数的参数类型

我们现在有这几个变量向实现Add,那么我们怎么实现呢?

 

就是这样,那么我看来看一下,是否和我们想要的效果一样

 

 

和我们想要的效果还是一样的,那么我们现在还是想实习Add但是我想实现int 和 double的呢??

 

我们看到出错了

 这里因为我们的函数模板参数只有一个值,但是这里传过去两个int 和 double,所以编译器并不知道用哪一个来定义我们的函数 ,所以这里是实例化不明确导致,那么我们应该怎么解决呢?

模板显示实例化

就是显示实例化

我们的显示实例化,就是在函数后面添加<>里面写上想要实例化的具体类型,这样之间指明道路,我们的编译器也可以帮我们更好的做事

而且我们的模板参数也并不知只能传一个,我们也可以有两个模板参数

 

就是这样,那么我们现在传两个类型的参数即使不用显示实例化,编译器也可以自动推导出来

虽然我们现在可以传两个类型的参数,但是我们的返回类型却只有一个

 类模板

 我们现在有一个stack的类

我们现在有一个程序,现在它有两个Stack的对象,其中一个想存int, 另一个想存 double

 

那么我们应该怎么做呢? 我们是应该 写两份相同的逻辑的代码吗? 显然不是

我们可以使用我们的类模板

就像是这样,如果我们现在既有int 也有double我们想存到Satck里面,我们闲杂ijiu可以依靠我们的模板来帮我们实例化出多份,不需要我们自己实现

但是我们来看一下,我们现在的s1 和 s2却出错了,为什么呢?

因为对于我们的普通类而言 ,我们的类名就是类型,但是对于模板类而言,我们的类名就是类名,我们的类型是类名加<模板参数类型>才是类型

是这样的,由于我们的函数模板有时可以依靠传的值来推测我们的类型,但是类模板却不可以,所以我们的类模板必须要显示实例化

今天的模板就到这里 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naxx Crazy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值