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的更多相关文章

  1. Centos 6.5 安装ELK

    安装java 查看java安装路径 修改环境变量 添加如下内容: export JAVA_HOME=/usr/java/jdk1.8.0_91 export PATH=$JAVA_HOME/bin:$ ...

  2. mapping 详解5(dynamic mapping)

    概述 在使用 ES 的时,我们不需要事先定义好映射设置就可以直接向索引中导入文档.ES 可以自动实现每个字段的类型检测,并进行 mapping 设置,这个过程就叫动态映射(dynamic mappin ...

  3. djano-cms学习笔计(一)

    开放源码的内容管理系统,基于Web框架Django的. 优势如下 高度可扩展的插件系统,可让您自由地构建各种内容的网站. 前端编辑直接更改您的网站上的内容.工程的所有插件. 感谢可读的网址的页面结构是 ...

  4. doT.js 模板引擎的使用

    dot.js是一个模板框架,在web前端使用. dot.js作为模板引擎, 主要的用途就是,在写好的模板上,放进数据,生成含有数据的html代码. 这是很简单的web前端模板框架, 简单说几个东西,你 ...

  5. 2018/2/13 ElasticSearch学习笔记三 自动映射以及创建自动映射模版,ElasticSearch聚合查询

    终于把这些命令全敲了一遍,话说ELK技术栈L和K我今天花了一下午全部搞定,学完后还都是花式玩那种...E却学了四天(当然主要是因为之前上班一直没时间学,还有安装服务时出现的各种error真是让我扎心了 ...

  6. Elasticsearch之索引模板index template与索引别名index alias

    为什么需要索引模板? 在实际工作中针对一批大量数据存储的时候需要使用多个索引库,如果手工指定每个索引库的配置信息(settings和mappings)的话就很麻烦了. 所以,这个时候,就存在创建索引模 ...

  7. kubernetes之监控Operator部署Prometheus(三)

    第一章和第二章中我们配置Prometheus的成本非常高,而且也非常麻烦.但是我们要考虑Prometheus.AlertManager 这些组件服务本身的高可用的话,成本就更高了,当然我们也完全可以用 ...

  8. Day 18: 记filebeat内存泄漏问题分析及调优

    ELK 从发布5.0之后加入了beats套件之后,就改名叫做elastic stack了.beats是一组轻量级的软件,给我们提供了简便,快捷的方式来实时收集.丰富更多的数据用以支撑我们的分析.但由于 ...

  9. Elasticsearch一些使用笔记(持续更新)

    这篇博客记录这一些运维ES的一些经验. 1.节点磁盘使用率过高,导致ES集群shard无法分配,丢失数据? 有两个配置,分配副本的时候 参数名称 默认值 含义 cluster.routing.allo ...

随机推荐

  1. MHA自动Failover过程解析(updated) 转

    允许转载, 转载时请以超链接形式标明文章原始出处和网站信息 http://www.mysqlsystems.com/2012/03/figure-out-process-of-autofailover ...

  2. unix fopen和fopen_s用法的比较

    在定义FILE * fp 之后,fopen的用法是: fp = fopen(filename,"w").而对于fopen_s来说,还得定义另外一个变量errno_t err,然后e ...

  3. C#综合揭秘——Entity Framework 并发处理详解

    引言 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework,.NET 都 ...

  4. Helpers\URL

    Helpers\URL The URL class is used for having handy methods or redirecting the page and returning the ...

  5. Direct3D-3 四元数

        其实本来这篇文章是打算接上篇的各种变化矩阵的推导了,想了想,还是先讲四元数吧.本人的文章并不会提到欧拉角,因为我自己没弄懂欧拉角的万向锁问题.     很多人学习数学时,会有这样一个疑惑,这东 ...

  6. 用RSA实现Web单点登录密码的加密传输

    在使用通用权限管理系统(吉日嘎拉)的单点登录功能时,对登录密码使用了RSA加密(非对称加密),有使用这个权限管理系统的可参考下. 前端部分,请引用以下几个js文件: <script type=& ...

  7. IJKMediaFramework第三方库的使用

    大多数做直播的时候使用 FFMpeg.  IJKMediaFramework也是基于FFMpeg封装 使用起来比较简单,个人觉得如果有能力可以使用 FFMpeg , 使用 FFMpeg对 内存的占用比 ...

  8. Lua垃圾收集

    Lua使用基于被内置在Lua某些算法的垃圾收集自动内存管理.可以自动内存管理的结果,作为一个开发者: 没有必要担心的对象分配内存. 无需释放他们时,不再需要可将其设置为nil. Lua使用运行不时收集 ...

  9. spring-boot配置外部静态资源的方法

    import java.io.File; import javax.servlet.Servlet; import lombok.extern.slf4j.Slf4j; import org.spri ...

  10. MSSQL系统表常用操作

    1:获取当前数据库中的所有用户表 select Name from sysobjects where xtype='u' and status>=0 2:获取某一个表的所有字段 select n ...