首页 > 其他分享 >函数模板

函数模板

时间:2023-04-04 22:15:01浏览次数:30  
标签:函数 auto tv1 tv2 类型 模板

一:基本范例
a)模板的定义是以template关键字开头的
b)类型模板参数T前面用typename来修饰,遇到typename就该知道其后面跟的是一个类型。typename可以被class取代
c)类型模板参数T(代表一个类型),前面的修饰符typename/class都用<>括起来
d)T这个名字可以换成任意其他标识符

 

二:实例化

实例化:编译时,用具体的“类型”代替“类型模板参数”的过程

函数模板(抽象符号)→模板函数(实际函数)→被调用

 

函数模板通过具体类型产生不同函数,编译器会对函数模板进行两次编译,

在声明的地方对模板代码本身进行编译;

在调用的地方对参数替换后的代码进行编译。

因函数模板需要二次编译,故声明与定义写在一起

 

编译期间:
在编译阶段,编译器会查看函数模板的 函数体 部分,来确定能否针对该类型控模型函数模板的实例化
在编译阶段,编译器需要能够找到函数模板的函数体部分,所以在写项目时把整个模板函数写在.h文件中

三:模板参数的判断
常规的参数判断
通过<>可以只指定一部分模板参数的类型,另一部分的模板参数的类型可以通过调用时给的实参来判断
auto代替函数模板返回类型
decltype,可以与auto结合使用来构成返回类型后置语法。这种后置语法其实也就是使用auto与decltype结合来完成返回值类型的推导
各种推断的比较以及空模板参数列表的推断

函数模板在调用时可以自动类型推导,但是类模板必须显示指定类型

int Sub(int tv1, int tv2)
{
    return tv1 - tv2;
}
    
float Sub(float tv1,float tv2)
{
    return tv1 - tv2; 
}

//template<typename T> //T称为 类型 模版参数,代表的是一个类型,名字可以任意起。
template<class T>//"class"可以代替typename
T Sub(T tv1, T tv2)
{
    return tv1 - tv2;
}
//template<typename T,typename U,typename V>
template<typename T, typename U>
//auto Add(T tv1, U tv2)//auto用于表达推导返回值类型的含义
auto Add(T tv1, U tv2)->decltype(tv1+tv2)//返回类型后置语法,auto只是返回类型后置语法的组成部分,并没有类型推导的含义
{
    return tv1 + tv2;
}
template<typename T>
T mydouble(T  tmpvale)
{
    return tmpvale * 2;
}

 

标签:函数,auto,tv1,tv2,类型,模板
From: https://www.cnblogs.com/huweide/p/17288065.html

相关文章

  • flask:cbv源码分析、模板语法、请求与响应、session及源码分析、闪现(flash)、请求扩展
    目录一、cbv源码分析1.1基于类的视图写法1.2源码分析1.3分析源码,查找不传别名的时候为什么函数名会变成别名1.4flask的路由注册使用装饰器,如果写了一个登录认证装饰器,那么应该放在路由装饰器上还是下?1.5dispatch_request讲解1.6知识点总结二、模板语法2.1py2.2html三、请......
  • 函数
    '''函数的意义'''#求每个字符串的长度str1="fqs123"str2="doudou"count=0foriinstr1:count+=1print(str(count))count=0foriinstr2:count+=1print(str(count))'''函数def函数名(传入参数):......
  • Kotlin中函数式编程的详解
     一、函数式编程理解我们一直在学习面向对象编程范式,另个一个较知名的编程范式是诞生于20世纪50年代,基于抽象数学的λ(lambda)演算发展而来的函数式编程,尽管函数式编程更常用在学术而非软件领域,但它的一些原则适用于任何编程语言。函数式编程范式主要依赖于高阶函数(以函数为参数或......
  • IDEA设置自动生成模板类和方法注释
    IDEA设置自动生成模板类和方法注释一、模板类注释在右侧粘贴如下代码:/***@BelongsProject:${PROJECT_NAME}*@BelongsPackage:${PACKAGE_NAME}*@Author:chuanwei.yang42624*@CreateTime:${YEAR}-${MONTH}-${DAY}${HOUR}:${MINUTE}*@Description:TODO*@Version:1......
  • 如何编写高质量的 JS 函数(3) --函数式编程[理论篇]
    作者:杨昆 【编写高质量函数系列】中,《如何编写高质量的JS函数(1)--敲山震虎篇》介绍了函数的执行机制,此篇将会从函数的命名、注释和鲁棒性方面,阐述如何通过JavaScript编写高质量的函数。 《如何编写高质量的JS函数(2)--命名/注释/鲁棒篇》从函数的命名、注释和鲁棒性方面,阐......
  • flask框架02 cbv分析 模板 请求与响应 session 闪现 请求拓展
    今日内容详细目录今日内容详细1cbv分析1.1源码分析2模板2.1py文件2.2html页面3请求与响应4session及源码分析4.1session的使用4.2源码分析5闪现6请求拓展1cbv分析#基于类的视图,写法fromflaskimportFlask,requestfromflask.viewsimportView,MethodView......
  • 快速模板——Echart包
    在ExtJS中虽然内置了图表包,但整体来说只能算可用。如果希望更好的效果,会引入别的图表包,如ExtJS自身引入了D3包,不过这是收费的。为了健全快速模板的功能,于是引入了EChart包来实现更好的图表功能。要将别的功能包引入到ExtJS,基本都是以扩展组件的方式来实现的,EChart包也不例外,这次......
  • cbv分析、模板、请求与响应、session及源码分析、闪现、请求扩展
    cbv分析#基于类的视图,写法fromflaskimportFlask,requestfromflask.viewsimportView,MethodViewapp=Flask(__name__)app.debug=True#视图类,继承MethodView,类中写跟请求方式同名的方法即可,之前学的所有都一致classIndexView(MethodView):defget(s......
  • 析构函数
    析构函数c++primerp444 1.构造函数初始化对象的非静态数据成员。2.析构函数释放对象使用的资源,并销毁对象的非静态数据成员。3.一个类只有唯一的析构函数。析构函数没有参数,不接受重载。  1.构造函数中,对象的成员初始化是在函数体执行之前完成的,并且按照它们在类中......
  • Python 内置函数map()
    内置函数mapmap(func,可迭代对象1,可迭代对象2...)map函数可以接收一个函数和一个或多个可迭代对象。接收的func函数有几个参数,就需要接收几个可迭代对象。map接收的函数会作用于可迭代对象的每个元素,并且返回一个值。map将可迭代对象的每个元素经过func函数处理返回的值组成......