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. POJ1463:Strategic game(树形DP)

    Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot f ...

  2. js中substr与substring的差别

    Js的substring和C#的Substring的作用都是从一个字符串中截取出一个子字符串,但它们的用法却有非常大的不同,下边我们来比較看看:  Js的substring  语法:  程序代码  S ...

  3. android UI进阶之实现listview的下拉加载

    关于listview的操作五花八门,有下拉刷新,分级显示,分页列表,逐页加载等,以后会陆续和大家分享这些技术,今天讲下下拉加载这个功能的实现. 最初的下拉加载应该是ios上的效果,现在很多应用如新浪微 ...

  4. mac 功能修改。。。。

    个人表示 Mac 下的 Spotlight 搜索功能确实是个鸡肋,安装 QuickSilver 才是王道!所以我个人就把 Spotlight 关闭掉了.方法很简单,还是要用到 “终端” 工具. 在 “ ...

  5. fl,flash,mx包的区别

    在ActionScript项目中还真是不能使用mx包中的UI组件.           Adobe官方论坛上有一个帖子讲述了这个问题,大致意思是说:你要使用mx包中像Button这样的UI组件都是从U ...

  6. C++之运算符重载(2)

    上一节主要讲解了C++里运算符重载函数,在看了单目运算符(++)重载的示例后,也许有些朋友会问这样的问题.++自增运算符在C或C++中既可以放在操作数之前,也可以放在操作数之后,但是前置和后置的作用又 ...

  7. 用scikit-learn实现朴素贝叶斯分类器 转

    原文:http://segmentfault.com/a/1190000002472791 朴素贝叶斯(Naive Bayes Classifier)是一种「天真」的算法(假定所有特征发生概率是独立的 ...

  8. XML 之 与Json或String的相互转换

    1.XML与String的相互转换 [1] XML 转为 String //载入Xml文件 XmlDocument xdoc = new XmlDocument(); xdoc.Load(" ...

  9. Debian apt-get 无法补全

    今天发现在终端里输入apt-get inst后按Tab键无法自动补全成 install,纳闷之余google了一下(我承认开始是baidu...),原来是没有安装 bash-completion. s ...

  10. 5个让DBA爱上你的SQL技巧

    我的一个同事Martin Masarik,SQLde的CEO,跟我谈起了他的一个DBA朋友,他管理着一个国际银行的Oracle数据库,数据规模约2TB.Martin Masarik曾问他:“什么样的S ...