泛型编程
可谓人如其名,泛着一词,就说明了通用,之前写代码的时候是不是逻辑一样但是参数不一样就需要在拷贝一份,修改变量名,而学了模版那么机会将少你2%的痛苦,这也是泛型编程基础
模版的基本介绍
函数重载不知道是否还记得,他解决了函数只是参数不同但是要取多个名字的问题,那么模版在此之上又进行了优化,可以让你少些一些代码
新装备 关键字:template
template<typename or class T>
这里你也可以和定义内置类型一样多个同时定义,只需要用 ==,==隔开
运行逻辑:
你把参数给模版,然后模版会根据参数来自动推演在生产对应的代码,就类似你却加工厂做香肠,你给他猪肉就是猪肉肠,牛肉就是牛肉肠,鱼也就是鱼肉肠……,他会更具你给的做出相应的东西
作用一:函数模版
swap这个函数是否记忆深刻,那么现在有了模版看看是如何降维
![](/qrcode.jpg)
不要传俩个不同类型的参数(swap函数)
上面说过参数类型是编译器自己推导的,那么你给俩个参数就会遇到一个尴尬的场景他是那个类型呢,如上述例子你带着鱼肉和猪肉去加工厂,那么混合做出来的是猪肉肠还是鱼肉肠呢?且那个还可以吃吗
又有一次你带着牛肉和猪肉去(add函数)
这次加工厂看着都是陆地上蹦的,霍在一起应该没啥问题,但是问你确定要这样,那么他是做成猪肉肠还是牛肉肠,你说做成猪肉肠(指定模版类型),后面你还是带着猪肉和牛肉去老板没有问你直接做成了猪肉肠(强制类型转换)
小细节
如果外部写好对应函数,默认调用他,这概念不难理解,毕竟和他更加适配,和穿鞋子一样,舒服的优先考虑,在……,这里也是这个道理
作用二:类模版
类是自定义类型,模版的参数是编译器自己推的,内置类型还好推,因为他多少个字节如何存储已经固定了,但是自定义类型呢,他多少个字节是不确定的所以需要指定类模版
演示:
需要注意的是上述代码,vector不是类型哦,vector<T> 才是类型,你想我们现在玩的是泛型编程,类又是不可以被推导的哦,这样他才知道是啥类型
例子:C语言的结构体
你自定义出来Date只有配合关键字struct才可以实例化对象,他们是一个整体,那么上面的vector<T>也是一一个道理
且定义和声名在不同文件
,比较模版的作用域没有那么长,如果类中的函数分离到外边定义需要在加模版参数(做用域比较小)
如图
总结
- 泛型编程:让一个逻辑差相同代码,可以让不同数据类型调用
- 模版:你传参编译器推导生成对于的代码
- 函数模版最好就是用同类型的,不同类型强转,或者指定
- 类模版一定要指定