1,演绎过程

匹配类型A(来自实参的类型),参数化类型P(行参参数声明)
如果被声明的参数是一个引用声明g(T& )那么P就是所引用类型T;
f(T)中P就是所声明的参数类;
decay指从数组和函数类型隐式转换为指针类型。
如果实参的类型是数组或函数类型,则会发生decay,此时还会忽略高层次的const和volatile限定符。

template <class
T>
T
const& max(T
const& a, T
const& b)


T被要求同时是char[7]和char[4]所以error.
如果去掉参数声明中的引用符号,则可以decay,演绎成char*就能编译通过了。

2,演绎上下文
根据一些基本的类型匹配构造出复杂的类型。

fp中T演绎为int**
fe中E为bool,N为32
fs中T1,T2,T3为int,S,double

复杂的类型声明都是产生自比它基本的构造;匹配过程从最顶层的构造开始,然后不断递归各种组成元素(即构造):大多数的类型声明构造都可以使用这种方式进行匹配,这些构造被称为演绎 的上下文。

某些构造不能作为演绎上下文:
受限制的类型名称,诸如Q<T>::X类型名称不能被用来演绎模板参数T。
除了非类型参数外模板参数还包含其他成份的非类型表达式,诸如S<T+2>,int(&)[sizeof(S<T>)]。

3,特殊的演绎
存在两种特殊情况,其中用于演绎的实参-参数对(A-P)并不是分别来自于函数调用的实参和函数模板的参数。
第1种情况出现在取函数模板地址的时候,此时P是函数模板声明的参数化类型,而A是被赋值或初始化的指针所代表的函数类型:
template<class
T>
void f(T, T);

void(*pf)(char, char) = &f;
上面P就是void(T, T),而A就是void(char, char)
pf被初始化为"特化f<char>"的地址

另一种特殊情况和转型运算符模拟一起出现,
资料说可以吧S转换为int(&)[20],于是P为T[N],A为int[20]
but,我测试却是无法转换,可能是vs不支持。

4,
模板实参演绎只能应用于函数模板和成员函数模拟,不能用于类模板和类模版的构造函数。

依赖于模板参数调用缺省实参

不是依赖型,也不能用于演绎模板实参

5,Barton-NackMan方法:限制的模板扩展
需要定义类模版的operator ==的时候,如果把该运算符声明为模板的成员,则改运算符的第一个实参(this指针)和第二个实参的转型规则可能不一致。而operator==意味着它的两个实参应该是对称的,有了不同转型后就很难保证这种对称性了 。
于是如下图把该运算符声明为一个名字空间作用域的函数供调用。

如果函数模板不能被重载,则在这个作用域中也不能声明其他的operator==模板了。
把这个运算符作为类的普通友元函数定义在类的内部即可。
假设用int类型来实例化模板类,那么作为实例化的结果,这个友元类运算符相应地被具体声明了(即确定了参数类型)。但是这个具体函数本身并不是函数模板实例化的结果,它本身就是一个非模板函数,只是借助于实例化过程的边缘效应它才被声明为一个具体函数,并且插入到全局作用域中。
由于是非模板函数,所以即使在语言不支持函数模板重载的情况下也可以对该运算符"重载",借助该技术可以不使用模板运算符operator==(T, T)却使运算符能应用于所有类型的T(无限扩展机制),因此叫做限制的模板扩展(restricted template expansion)。
由于友元定义在类定义的内部,因此它被隐式的看作是inline的,因此可以把实现委托给一个函数模板,这个函数模板不需要内联也不会和相同名字的其他模板冲突。


模板运算符重载:        Arry<>::operator==
运算符友元:            operator==
命名空间作用域运算符:    operator==<>

-------------------------------------------------
该技术的关键就是在类模板实例化的过程中,伴随生成一个非模板的具体函数。
而且这个函数并不产生自函数模板,因此也不需要去进行模板实参演绎,但该函数却属于重载解析规则。

template_11实参演绎的更多相关文章

  1. C++ template —— 实例化和模板实参演绎(四)

    本篇讲解实例化和模板实参演绎-------------------------------------------------------------------------------------- ...

  2. MFC 框架技术简单研讨

    引用:http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181986.html 正文: 第一讲 Win32 App  和  MFC Fr ...

  3. C++函数模板

    函数模板提供了一种函数行为,该函数行为可以用多种不同的类型进行调用,也就是说,函数模板代表一个函数家族,这些函数的元素是未定的,在使用的时候被参数化. 本文地址:http://www.cnblogs. ...

  4. template_12特化与重载

    1,重载函数模板f<int*>((int*)pi);//1f<int>((int*)pi);//2上面用int*替换第一个模板的T,用int来替换第二个模板的T.那么将得到两个 ...

  5. template_1

    0: 模板是一些为多种类型而编写的函数和类,而且这些类型都没有指定.当使用模板的时候,只需要把所希望的类型作为一个(显示或隐示的)实参传递给模板.模板是语言本身所具有的特效,她完全支持类型检查和作用域 ...

  6. c++ 静态多态与动态多态

    多态polymorphism是指具有多种形态的情况,它能根据单一的标记关联不同的行为.多态是面向对象程序设计的基础.在面向对象程序设计中的多态是一种运行时的多态.C++中有两种多态,称为动多态(运行时 ...

  7. C++中的静态多态和动态多态

    C++中的静态多态和动态多态 今天的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式( ...

  8. C++—模板(1)模板与函数模板

    1.引入 如何编写一个通用加法函数?第一个方法是使用函数重载, 针对每个所需相同行为的不同类型重新实现这个函数.C++的这种编程机制给编程者极大的方便,不需要为功能相似.参数不同的函数选用不同的函数名 ...

  9. C++多态(静多态和动多态)

    如今的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式(object-oriented ...

随机推荐

  1. ResultSet转成java类对象

    在做web开发时遇到一个事情: 需要从mysql数据表中查询数据并遍历查询结果 这样最简单的方式是:查询到结果根据表中字段列表的顺序来一个个获取字段,但这样需要记住字段的顺序,操作起来不是那么方便.因 ...

  2. WPF UI布局之概述

    在线演示:http://v.youku.com/v_show/id_XNzA5NDk2Mjcy.html 清晰版视频+代码下载:http://115.com/lb/5lbeer0m9lad 一.简单介 ...

  3. swift获取图片像素颜色值

    extension UIImage{ /** 获取图片中的像素颜色值 - parameter pos: 图片中的位置 - returns: 颜色值 */ func getPixelColor(pos: ...

  4. iOS开发——实用篇&提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  5. PHP获取解析URL方法

    们要经常对url里面所带的参数进行解析,如果我们知道了url传递参数名称,例如: /index.php?name=tank&sex=1#top 我们就可以通过$_GET['name'],$_G ...

  6. Python学习 之 编程

    1.搭建python环境 交互模式:输入python进入交互模式,exit()退出交互模式 文本模式:新建*.py文件,编辑*.py文件,运行python *.py 2.python文件类型 (1)源 ...

  7. 实例源码--Android简单音乐播放器源码

      下载源码   技术要点: 1.本地音乐管理 2.在线音乐听歌.下载 3.音频流的解码 4. HTTP通信模块 5. Sqlite数据库 6. 源码带详细的中文注释 ...... 详细介绍: 1.本 ...

  8. Discuz!X/模板标签说明

    Discuz 模板标签说明 Discuz! 的模板采用近似 PHP 表达式的语法,基本都是可识别的HTML,但涉及到变量和动态内容时,基本形式下: <!-{ 代码内容 }-> 逻辑元素包围 ...

  9. JSONP(处理跨域问题)

    Ajax直接请求普通文件存在跨域无权限访问的问题 凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>.<img>.<iframe& ...

  10. CentOS 6.4 安装 thrift-0.9.3

    前言 为了能给.NET的程序提供HBase访问接口需要在Hadoop/Spark集群上安装Thrift Thrift介绍 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强 ...