**

因为本人之前一直写的是电子笔记,对自己学会的东西作一个总结,所以基本都是文字,本来想全发成博客的形式,发现全发成博客比较花费时间,而且一直发博客质量不是很好,而且通过发博客学到的东西也会变少,所以准备先把笔记发出来,后续再将它们改成博客的形式,争取2天至少改一篇博客,觉得我总结的还行的可以先关注我,后续会发成博客形式,内容也会更加完善

**
模板:
模板可以有二种传参方式,一种是根据模板要求的那样在<>内写上你要生成的模板类型,如果在定义时有缺省的可以不写,还有一种叫做类型推导的方法,并不是c++11提出的那个类型推导(auto之类),而是函数本身的类型推导,在你给函数传参时,一般情况下,因为你知道函数需要什么类型的值,所以你可以直接传不用声明,但换成类模板后,你往函数中传参,因为它是一个函数,所以在理论上你不用写类型的声明,函数是可以接收的,只是在接收后它的类型要做出判断,现在我们的函数是一个模板函数,它的类型可以任何类型,所以它在做出判断时,就可以直接确定函数参数的类型,进而使用,这也是函数唯一在模板这块可以有的变化,不用显示写出参数的类型,可以自动作推导,但类模板就不行,因为实例化一个类,它不是马上就用的,所以你必需传模板参数
模板还有非类型模板和类型模板之分,类型好理解,就是你要给模板传什么类型,非类型是指你在模板中已经定义好了类型,然后用这个类型定义出了一个这个类型的变量,然后你可以给这个值给一个缺省值,或者你可以直接传值,之后,你可以把它想象成已经定义好的常量来使用,就是提前定义好了,不需要在类中再重新定义为一个成员,为什么说当做一个常量,因为它是不可修改的,它有一些限制,不能传浮点的类型和类类型
还有一个模板的分离式编译:
就是说你在一个cpp文件中定义了一个模板函数,但是你在hpp中对它做了声明,然后在另一个cpp文件中包含了hpp头文件,想使用这个函数,但是使用不了了,因为c++在编译时,hpp是不参数编译的,在你使用时,因为hpp里面只是做了一个声明,但它并不知道你已经在别的文件中定义的这个模板函数,因为我们在编译时,一个文件一个文件的编译所以头文件只是知道有这么个东西,也有这个函数的地址,但它认为你没有定义(也就是实现这个函数),所以你不能使用它,所以要解决这个问题只要在声明它的地方,定义它就行了,不要分离定义
模板的特化:
模板的特化分为:全特化和偏特化两种
为什么要进行模板的特化,原因是在我们使用模板时会出现几个问题,首先就是模板只认识单个类型比如:char, int等,而一但我们向模板函数传进去的是char*它就不认识了,还有就是因为模板的存在让类相当于有了类型,这和函数的重载很像,当我们想让同一个类名,不同类型使用不同代码时我们就会用到特化,相当于类的重载,这个也可以理解为这个类名代表了这个作用,我不想改,但不同的类型我用的方法不同,所以我就可以利用重载,进行模板特化的原因大概是这两点
全特化和偏特化都是要在已经有一个完整的模板的情况下,不然后没必要使用特化
全特化是指:将原来的模板变量全都变成确定的类型,要在函数名或类名后面加上<>,在<>里面写出要特化的类型
偏特化是指:将原来的模板变量中的部分变量变成确定的类型,比如原来有两个模板变量,现在有一个要特化,还是要加<>的,但里面的值,一个是模板变量一个是确认的类型,还有一种情况,就是因为模板只认一个类型,所以当我们用指针或者引用时,它就不认识了,但我们不知道是哪种类型的指针,所以它也可以做偏特化,就是在<>中在模板变量后面再加一个指针或引用的符号就行了
此外需要注意的是
1.特化和重载是不同的,重载函数后的参数可以少,特化不能,我觉得这样做的原因是,我们本来做的就是一个模板,就是一个模型,所以这个模型就不应该不一样,哪块都不能少,我们的特化只是为了在做模型的原料上进行一个优化,不想改变模板的特点
2.特化时你要用到的类型个数必须和原来的模板类型个数相同
3.在使用模板函数时,你的特化时的类型顺序,就是你函数参数的类型顺序,并且你函数参数前的类型必须写上
4,在类中不受顺序的影响,它就像是一个标记,来说明你是哪一个

本文来互联网采集,已注明来源,如未注明来源可能来源未知,如有侵权请联系站长删除处理。

发表回复

后才能评论