template_1
0:
模板是一些为多种类型而编写的函数和类,而且这些类型都没有指定。当使用模板的时候,只需要把所希望的类型作为一个(显示或隐示的)实参传递给模板。模板是语言本身所具有的特效,她完全支持类型检查和作用域。
并不是把模板编译成一个可以处理任何类型的单一实体;而是对于实例化模板参数的每种类型,(编译器)都从模板产生出一个不同是实体。
这种用具体类型代替模板参数的过程叫实例化(instantiation)。她产生一个模板的实例。
1:
如何试图基于一个不支持模板内部所使用的操作的类型实例化一个模板,将会导致一个编译期错误。
so,模板被编译了两次:a,实例化之前,先检查模板代码本身语法是否正确;b,在实例化期间,检查是否所模板的有调用都有效。
这不同于普通函数中编译与链接之间的区别,对于普通函数只要有声明(不需要定义)就可以通过编译。然而当使用函数模板并引发模板实例化的时候,编译器需要查看模板的定义。
2:实参演绎deduction
template <typename T>//T是模板参数
inline T const& max (T const& a, T const& b)//a.b是调用参数
{
return a < b ? b : a;
}
如果传递两个int给参数类型T const&,那么编译器能够得出结论:T必须是int。这里不允许进行自动类型转换。
max(4, 5.6);
error MSB6006: “CL.exe”
error C2782: “const T &max(const T &,const T &)”: 模板 参数“T”不明确
解决error:
对实参强制类型转换max(4, static_cast<int>4.2);
显示指定T类型指定两个不同类型参数。
inline T1 const& max (T1 const& a, T2 const& b)
对于指定两个不同类型参数,由于该模板函数有返回类型,另个参数的实参可能要转型为返回类型而不会在意调用者意图;而且把另一个参数转型为返回类型的过程将会创建一个局部临时对象,所以返回类型必须是T1不能是T1 const& 。
因为调用参数(a,b)的类型构造自模板参数T,所有模板参数和调用参数通常是相关的。这个概念就叫实参演绎。
如max<double>(4, 4.2);用double实例化T,从而构造调用参数类型。
当模板参数和调用参数没有发生关联或不能由调用参数确定模板参数时,在调用时就必须显示指定模板实参。
template <typename T1, typename T2, typename RT>
inline RT max (T1 const& a, T2 const&
b);
模板实参演绎并不适合返回类型,因为RT不会出现在调用参数的类型里面,因此调用并不能演绎出RT。所以需要显示指导模板实参列表。
max<int, double, double> max(4, 4.2);
如果改变模板参数的声明顺序就只需指定返回类型
template < typename RT , typename T1, typename T2,>
max<double>(4, 4.2);
因为必须显示指定”最后一个不能被隐式演绎的模板之前的”所有实参类型,返回类型不能被演绎而调用参数可让演绎过程推导出。
3:重载函数模板
int const& max(int onst& a, int const& b)
{return a<b?b:a; }
template<typename T>
inline T const& max(T const& a, T const& b)
{return a<b?b:a; }
template<typename T>
inline T const& max(T const& a, T const& b, T const& c)
{ max(max(a, b), c); }
max(7,4,5);//调用三参数的模板
max(4.2, 3.0);//调用max<double>(通过实参演绎)
max(‘a’, ‘b’);//调用max<char>(通过实参演绎)
max(3, 5);//调用int重载的非模板函数
max(3, 5.1);//调用int重载的非模板函数
max<>(3, 5);// 调用max<int>(通过实参演绎)
max<double>(3, 5);// 调用max<double>(没实参演绎)
template_1的更多相关文章
- Centos 6.5 安装ELK
安装java 查看java安装路径 修改环境变量 添加如下内容: export JAVA_HOME=/usr/java/jdk1.8.0_91 export PATH=$JAVA_HOME/bin:$ ...
- mapping 详解5(dynamic mapping)
概述 在使用 ES 的时,我们不需要事先定义好映射设置就可以直接向索引中导入文档.ES 可以自动实现每个字段的类型检测,并进行 mapping 设置,这个过程就叫动态映射(dynamic mappin ...
- djano-cms学习笔计(一)
开放源码的内容管理系统,基于Web框架Django的. 优势如下 高度可扩展的插件系统,可让您自由地构建各种内容的网站. 前端编辑直接更改您的网站上的内容.工程的所有插件. 感谢可读的网址的页面结构是 ...
- doT.js 模板引擎的使用
dot.js是一个模板框架,在web前端使用. dot.js作为模板引擎, 主要的用途就是,在写好的模板上,放进数据,生成含有数据的html代码. 这是很简单的web前端模板框架, 简单说几个东西,你 ...
- 2018/2/13 ElasticSearch学习笔记三 自动映射以及创建自动映射模版,ElasticSearch聚合查询
终于把这些命令全敲了一遍,话说ELK技术栈L和K我今天花了一下午全部搞定,学完后还都是花式玩那种...E却学了四天(当然主要是因为之前上班一直没时间学,还有安装服务时出现的各种error真是让我扎心了 ...
- Elasticsearch之索引模板index template与索引别名index alias
为什么需要索引模板? 在实际工作中针对一批大量数据存储的时候需要使用多个索引库,如果手工指定每个索引库的配置信息(settings和mappings)的话就很麻烦了. 所以,这个时候,就存在创建索引模 ...
- kubernetes之监控Operator部署Prometheus(三)
第一章和第二章中我们配置Prometheus的成本非常高,而且也非常麻烦.但是我们要考虑Prometheus.AlertManager 这些组件服务本身的高可用的话,成本就更高了,当然我们也完全可以用 ...
- Day 18: 记filebeat内存泄漏问题分析及调优
ELK 从发布5.0之后加入了beats套件之后,就改名叫做elastic stack了.beats是一组轻量级的软件,给我们提供了简便,快捷的方式来实时收集.丰富更多的数据用以支撑我们的分析.但由于 ...
- Elasticsearch一些使用笔记(持续更新)
这篇博客记录这一些运维ES的一些经验. 1.节点磁盘使用率过高,导致ES集群shard无法分配,丢失数据? 有两个配置,分配副本的时候 参数名称 默认值 含义 cluster.routing.allo ...
随机推荐
- 一个简单的小例子让你明白c#中的委托-终于懂了!
模拟主持人发布一个问题,由多个嘉宾来回答这个问题. 分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类. 作为问题的发布者,Host不知道问题如何解答.因此它只能发布这个事件,将事 ...
- C# 采用线程重绘图形要点记录
大家都知道J2ME 采用一个线程去获取数据,然后得到数据后更新屏幕是件很容易的事情,比如Thread{public void run(){ getData();repaint(); } }这样做就OK ...
- C++ AfxBeginThread
计算从1+2+3...+100000=? 关键点 CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, in ...
- Java log code example
Java log example Logrecord filter import java.util.logging.Filter; import java.util.logging.Level; i ...
- PHP写入文件用file_put_contents代替fwrite优点多多(转)
使用php有一段时间了,之前一直用fwrite写入文件,不过当我知道file_put_contents这个函数之后,fwrite就比较少用了,file_put_contents比fwrite代码更简洁 ...
- Flex中 Array 的IndexOf 的作用
Flex中 Array 的IndexOf 的作用 1.说明 indexOf用于在索引中从小到大查找,假设查得到就返回索引值,查不到就返回-1: 2.实例 (1)设计源代码 <?xml ve ...
- 粒子系统1:简介&工具使用
直接使用工具来感受一下粒子系统的强大威力吧. 网络上有很多粒子编辑器,大多数都是收费的.magicalsoft提供了一个免费的粒子编辑器(该工具目前只有mac版本),界面如下: 我们将针对这个编辑器来 ...
- C++之运算符重载(2)
上一节主要讲解了C++里运算符重载函数,在看了单目运算符(++)重载的示例后,也许有些朋友会问这样的问题.++自增运算符在C或C++中既可以放在操作数之前,也可以放在操作数之后,但是前置和后置的作用又 ...
- SQL SERVER 函数大全[转]
SQL Server 函数大全 一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果.这些要求包括:执行计算与数学运算.转换数据.解析数值.组合值和聚合一个范围内的值等. 下 ...
- CentOS5.6 安装RabbitMQ
步骤参考官方地址:http://www.rabbitmq.com/install-rpm.html我们这个版本按照官方的不能正确安装. 1.安装erlang(官网地址http://www.erlang ...