C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参
1. 类型参数可以使用任何名字(通常命名为 T)
template <typename Foo> Foo calc (const Foo& a, const Foo& b){Foo tmp = a; / / tmp 的类型与参数和返回类型一样//...return tmp; // 返回类型和参数类型一样
}
1.1 模板参数与作用域
一个模板参数名的可用范围:声明之后, 至模板声明或定义结束之前。
- 与任何其他名字一样, 模板参数会隐藏外层作用域中声明的相同名字。
typedef double A;template <typename A, typename B> void f (A a, B b){/ / tmp 的类型为模板参数 A 的类型 , 而非 double/ / 错误: 重声明模板参数 BA tmp = a;double B;
}
- 一个模板参数名在一个特定模板参数列表中只能出现一次(与大多数其他上下文不同, 在模板内不能重用模板参数名)
// 错误: 非法重用模板参数名 v
template〈typename V, typename V>//...
1.2 模板声明
模板声明必须包含模板参数
/ / 声明但不定义 compare 和 Blob
template <typename T> int compare (const T &, const T & );
template <typename T> class Blob;
- 与函数参数相同, 声明中的模板参数的名字不必与定义中相同,但必须有相同数量和种类( 即, 类型或非类型) 的参数。
/**************3 个 calc 都指向相同的函数模板**************///模板的声明
template ctypename T> T calc (const T &, const T& ); / / 声明
template <typename U> U calc (const U&, const U& ); / / 声明//模板的定义
template <typename Type> Type calc (const Types a, const Types b) { / •" / }
1.3 使用类的类型成员
为了处理模板, 编译器必须知道名字是否表示一个类型。
例如, 假定 T 是一个类型参数的名字,语句有歧义: T::sizetype * p;
- 一个名为 p 的变量?
- 一个名为 SiZe_type 的 static 数据成员与名为 p 的变量相乘?
默认情况下, C++语言假定通过作用域运算符访问的名字不是类型。 因此, 如果我们希望使用一个模板类型参数的类型成员, 就必须显式告诉编译器该名字是一个类型。 我们通过使用关键字 typename 来实现这一点:
//top 函数期待一个容器类型的实参, 它使用 typename 指明其返回类型并在 c
//中没有元素时生成一个值初始化的元素( 参见 7.5.3 节, 第 262 页) 返回给调用者.template <typename T> typename T::value_type top (const T& c ) {if (!c.empty ( ) )return c.back ( ) ;elsereturn typename T::value_type ( );
}
C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参相关推荐
- C++ Primer 学习笔记_75_模板与泛型编程 --模板定义
模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化
1. 场景 //第一个版本:可以比较任意两个类型 template <typename T> int compare (const T &, const T & );//第 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板
1. 可变参数模板( variadic template) 一个接受可变数目参数的模板函数或模板类. 1.1 参数包 (parameter packet) 可变数目的参数被称为参数包,存在两种参数包: ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)重载与模板
1. 定义 函数模板可以被另一个模板或一个普通非模板函数重载: 名字相同的函数必须具有不同数量或类型的参数 1.1 函数模板匹配因素 对于一个调用, 其候选函数包括所有模板实参推断成功的函数模板实例. ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)函数模板显式实参
1. 返回类型不清楚的时候,尾置返回允许我们在参数列表之后声明返回类型 template ctypename It> ??? & fcn (It beg, It end) {// 处理序 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)成员模板
1. 成员模板( member template) 一个类( 无论是普通类还是类模板) 可以包含本身是模板的成员函数. 成员模板不能是虚函数. 1.1 普通( 非模板 ) 类的成员模板 / / 函数对 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板成员函数的实例化
1. 默认情况下,一个类模板的成员函数只有当程序用到它时才进行实例化. (即使某种类型不能完全符合模板操作的要求(参见9.2节,第294页),我们仍然能用该类型实例化类todo). eg. //实例化 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程) 类模板的成员函数
1. 分类 1.1 定义在类模板内的成员函数 被隐式声明为内联函数. 1.2. 类模板外部的成员函数, 类模板的成员函数本身是一个普通函数.但是,类模板的每个实例都有其自己版本的成员函数.因此,类模板 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义
1. 定义 类似函数模板,类模板以关键字template开始,后跟模板参数列表.在类模板(及其成员)的定义中,我们将模板参数当作替身,代替使用模板时用户需要提供的类型或值: template < ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类型无关和模板编译
1. 编写类型无关的代码 泛型代码的两个重要原则: 模板中的函数参数是const的引用. 函数体中的条件判断仅使用<比较运算. 大多数类型,包括内置类型和我们已经用过的标准库类型(除unique ...
最新文章
- 微信小程序把玩(四十)animation API
- 3G,三足鼎立;花开千朵,各表一枝!!!
- TP5:验证器的封装——5
- 深度残差收缩网络:(一)背景知识
- [转]从java角度理解cpu上下切换
- SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常
- In the beginning, the world was void and without form…
- 60、剑指offer--把二叉树打印成多行
- C语言 —— 回调函数
- 较完整的 bean生命周期
- 【STM32F407的DSP教程】第17章 DSP功能函数-定点数互转
- 微软中国CEO梁念坚 : Windows Phone有四大优点
- 小白也能懂的 Python 入门指南(1)——Python 的前世今生
- html表格列宽度 比例,HTML表格的整体宽度,以及各列的宽度均可以由( )属性来控制。...
- 分布式事务解决方案汇总:2PC、3PC、消息中间件、TCC、状态机+重试+幂等(转)
- ssd hdd linux分区方案,windows10+ubuntu 16.04+双硬盘(SSD+HDD)分区(图文)
- 震撼来袭!剪映专业版出内测了!最新功能抢先使用!
- canvas与CreateJS实现图片动画
- 分布式优化算法的背景,应用场景,研究动态
- ClickHouse入门技术分享PPT之一
热门文章
- Java集合:Hashtable源码分析
- Android --- 199 198开头手机号正则表达式无效
- element ui 下拉列表验证无效的问题(通俗易懂)-实例讲解
- JPA-CascadeType四个属性的讲解
- python乘法模板_python – 使用矩阵乘法的numpy模板匹配
- mysql获取日期的月日_MySQL获取月,日的日期列表
- 大一java实训报告1500字_社会实践报告1500字
- 推动数据中心绿色转型(经济透视)
- 2019年备受关注的5个IT系统灾难恢复技术趋势
- Anaconda :利用Anaconda Prompt (Anaconda3)建立、设计不同python版本及对应库函数环境之详细攻略