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>(没实参演绎)

转载于:https://www.cnblogs.com/liuhan333/p/5705962.html

template_1相关推荐

  1. OpenCV中使用模板匹配识别空闲的货架空间

    但是点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 假设你是一名在超市工作的员工,被要求在商店里四处走动,检查需要 ...

  2. Elastricsearch 索引操作详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

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

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

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

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

  5. [k8s]elk架构设计-k8s集群里搭建

    elasticsearch和mysql的对比 https://blog.csdn.net/qq_21383435/article/details/79323383 Mapping ~ Schema m ...

  6. 白话Elasticsearch73_ES生产集群中的索引管理02

    文章目录 概述 官方指导 1.mapping管理 2.索引别名管理 3.index settings管理 3.1 Update index settings API 3.2 Get index set ...

  7. es常用curl命令

    [说明]仅记录实验室测试过程,不作为官方文档使用,可能会有很多地方未能验证,因此无法进行技术兜底,需使用方多加验证测试,涉及到高危需走变更.目前测试版本均为651及以前版本,命令样例基于安全模式,如果 ...

  8. 如此简单 | ElasticSearch 最全详细使用教程

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:r6a.cn/cyJw 本文介绍了ElasticSearch的必备知 ...

  9. 05.multi_search_template

    文章目录 multi search template API允许使用_msearch/template在同一API中执行多个search template请求. 格式一般是 header\n body ...

最新文章

  1. SpringMvc之@RequestParam详解
  2. 解读丨从自动驾驶到学习机器学习:科技发展的15大趋势
  3. SQL SERVER 通用分页存储过程
  4. 解决Unity3D导出apk失败:Failed to re-package resources
  5. 《Core Java 2》读书笔记(二)
  6. ACT开发初步(二)——XML
  7. 解决redis 配置文件设置密码不生效的问题
  8. java毕业设计——基于java+Java Swing+sqlserver的图书馆书库管理系统设计与实现(毕业论文+程序源码)——图书馆书库管理系统
  9. php codeigniter 语言,CodeIgniter多语言实现方法详解
  10. Autumn源码解读
  11. 生活所迫?那些年摆过的地摊,有你么?
  12. k8s报错503或者其他网络错误 Readiness probe failed: HTTP probe failed with statuscode: 503
  13. c语言定义寄存器中的两位,汇编语言:编写一个程序,显示AL寄存器中的两位十六进制数...
  14. 隔行换色并且鼠标指向行变色的表格
  15. html中怎么引用jquery
  16. hdl_localization试读
  17. 脚印(Foot Print)效果制作
  18. 2021新版本Nacos配置中心提示‘url‘ attribute is not specified and no embedded datasource could be configured
  19. 【openVINO+paddle】CPU部署新冠肺炎CT图像分类识别与病害分割
  20. 甘建二告诉你助理工程师职称的九大作用,你不得不知道的

热门文章

  1. 白话 Session 与 Cookie:从经营杂货店开始
  2. UidGenerator
  3. Spring Cloud Alibaba迁移指南2:一行代码从Hystrix迁移到Sentinel
  4. Spring Boot 返回 JSON 数据,一分钟搞定!
  5. vue使用element日期选择器,选择日期少一天的问题
  6. Java JTextArea参数介绍
  7. Android --- 详细介绍透明式状态栏和沉浸式状态栏
  8. win7计算机内存占用高,WIN7系统电脑内存占用高的解决办法有哪些
  9. win7映射网络驱动器消失了_网络资源共享;共享权限控制
  10. html文本长度不一样的对齐,关于html:文本在中间不对齐