当前位置:网站首页 > Go语言开发 > 正文

ifstream函数的用法(ifstream good函数)



在之前,如果我们想封装一个 交换的函数,我们需要怎么写呢?

在这里插入图片描述

那如果传的参数是double类型的话,则需要重新写函数,但大致相同,只是将类型改变。(这些函数构成了函数重载)
在这里插入图片描述
使用函数重载虽然可以实现,但是有一下几个不好的地方:

  1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数
  2. 代码的可维护性比较低,一个出错可能所有的重载均出错

在相似程度很高的情况下,思考一下:我们是否可以告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?

由此产生了函数模板,但注意,函数模板中,模板才是主体(函数并不是主体)

函数模板也叫“泛型编程”,泛型—>广泛的类型,也就是参数的类型是广泛的,并没有确定,是什么都可以。【泛型编程:编写与类型无关通用代码,是代码复用的一种手段。模板是泛型编程的基础。】

(函数模板与类型无关关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

 
  
  1. typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
  2. T只是一个名字,可以改成其他的,但这个会比较有意义,是typename的开头字母

Swap的案例

 
  

注意点:

 
  

简单理解:在以前,我们需要自己写很多个相似度很高的函数(自己是牛马),但有了函数模板之后,我们给编译器写模板,让编译器当牛马,实例化生成对应函数(何为实例化,后面详细)

在这里插入图片描述

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参的类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。


 
   

(1)这一步就是调用了编译器生成的函数

 
   

(2)如果此处的x和y类型不同,有两种办法:

1.将其中一个类型强制转换成另一个类型,但这个不太合理,一般是不想强转的

 
   

2.定义多个模板函数(会造成精度下降)

 
   

同时注意:, ,它们并不会构成重载,是它们实例化的函数构成了重载。

用不同类型的参数使用函数模板时,称为函数模板的实例化。

简单来说:实例化就是模板生成函数的过程

语法上:--------声明模参,替换
1.声明模板参数的类型:
2.将泛型的地方替换成模板参数(模参),即暂不知道类型的地方替换为T

4.1 隐式实例化(编译器自动推导类型)

何为隐式?

即不用我们告诉编译器,它是int,double还是float,而由编译器自己根据实参的类型去推断

 
   

4.2 显式实例化

这种不用编译器自己推导,我们已经明确标注了(在函数名后的<>中指定模板参数的实际类型),编译器直接生成对应函数即可。

如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

 
   

有一种情况必须使用显式实例化:

某个函数,它的参数,不带有模参T。这种必须用显式实例化

 
   

一个非模板函数(下图int那个函数)可以和一个同名的函数模板(下图的T那个模板)同时存在,而且该函数模板还可以被实例化为这个非模板函数

 
   

我们可以将看作外卖,可以直接使用。看作自己做饭,编译器需要由T推int,再生成函数。有方便的肯定使用方便的,即那个int函数。

但是如果写成,那么则必须使用函数模板了。

到此这篇ifstream函数的用法(ifstream good函数)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 特殊符号 苹果(特殊符号苹果logo)2026-01-30 18:45:06
  • 预训练语言模型(预训练语言模型是什么)2026-01-30 18:45:06
  • 嵌入式驱动开发是做什么的(嵌入式驱动开发就业前景)2026-01-30 18:45:06
  • 编程入门应该学什么语言(编程入门学什么语言好)2026-01-30 18:45:06
  • bsp驱动开发怎么学(bsp驱动开发工资高吗)2026-01-30 18:45:06
  • 嵌入式驱动开发面试题(嵌入式驱动开发笔试题)2026-01-30 18:45:06
  • linux内核驱动开发教程(linux驱动编译进内核)2026-01-30 18:45:06
  • 苹果开发者账号出售多少钱(一个苹果开发者账号多少钱)2026-01-30 18:45:06
  • 预训练语言模型的前世今生(预训练语言模型是什么)2026-01-30 18:45:06
  • 苹果开发者企业账号有什么用(苹果企业开发者账号是什么)2026-01-30 18:45:06
  • 全屏图片