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. 第29题:推断一个序列是否是还有一个push序列的pop序列

    github:https://github.com/frank-cq/MyTest 第29题:输入两个整数序列,当中一个序列表示栈的push顺序,推断还有一个序列有没有可能是相应的pop顺序.为了简单 ...

  2. linux下tomcat开机自启动

    tomcat自启动配置: 方法一: vi /etc/rc.local 添加如下一行 /opt/apache-tomcat-7.0.29/bin/startup.sh (脚本绝对路径) 注意:要添加在e ...

  3. PHP概率算法(适用于抽奖、随机广告)

    做网站类的有时会弄个活动什么的,来让用户参加,既吸引用户注册,又提高网站的用户活跃度.同时参加的用户会获得一定的奖品,有100%中奖的,也有按一定概率中奖的,大的比如中个ipad.iphone5,小的 ...

  4. XtraBackup原理3

    http://mysql.taobao.org/monthly/2016/03/07/ MySQL · 物理备份 · Percona XtraBackup 备份原理 前言 Percona XtraBa ...

  5. Link List

    At first, i prepared to go through <the introduction to algorithm> ,however , i found some par ...

  6. 十六款值得关注的NoSQL与NewSQL数据库--转载

    原文地址:http://tech.it168.com/a2014/0929/1670/000001670840_all.shtml [IT168 评论]传统关系型数据库在诞生之时并未考虑到如今如火如荼 ...

  7. Turn the pokers

    Problem Description During summer vacation,Alice stay at home for a long time, with nothing to do. S ...

  8. cocos2d-x lua 触摸事件

    cocos2d-x lua 触摸事件 version: cocos2d-x 3.6 1.监听 function GameLayer:onEnter() local eventDispatcher = ...

  9. Hummer框架平台介绍

    三年工作过程中经常会用到使用Java开源框架,但经常会遇到重新组合比较麻烦,本次采用目前主流开源框架及插件整理出一套融合开发.测试.部署整个流程的平台. 本平台采用Hummer代号,是悍马和蜂鸟分意思 ...

  10. 转载:Restore SQL Server database and overwrite existing database

    转载自:https://www.mssqltips.com/sqlservertutorial/121/restore-sql-server-database-and-overwrite-existi ...