一:基本范例
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