16模板与泛形编程

16模板与泛形编程

Oop能处理类型在程序运行之前都位置的情况;而在泛形编程中,在编译时就能获知类型了。

16.1定义模板

16.1.1函数模板

模板参数列表中,每一个参数都要加上关键字typename或者class

非类型模板参数

表示一个值而非一个类型,必须是常量表达式,可以是一个整形或者是指向对象或函数类型的指针或(左值)引用。

Inline和constexpr必须在模板参数列表之后,返回类型之前。

模板编译

当编译器遇到一个模板定义时,它并不生成代码。只有在实例化末班的一个特定版本是编译器才会生成代码。

函数模板和类模板成员函数的定义通常放在头文件。

大多数编译错误在实例化期间报告

编译器在三个阶段报告错误

(1)编译模板本身

(2)编译器遇到模板使用时

(3)模板实例化

16.1.2类模板

类模板的成员函数

我们既可以在类模板内部,也可以在类模板外部为其定义成员函数,类模板内定义的函数被隐式声明为内联函数。

类模板成员函数的实例化

一个类模板的成员函数只有当程序用到它是才进行实例化。

在类代码内简化模板类名的使用

在类模板自己的作用域中,可以直接使用模板名而且不提供实参。

模板类型别名

定义一个模板类型别名是,可以固定一个或多个模板参数。

类模板的static成员

相同类型的模板类只有一个相同名字static的值

16.1.3模板参数

一个模板参数名的可用范围是在其声明之后,至模板声明或定义结束之前、模板参数会隐藏外层作用域中声明的相同名字。模板内不能重用模板参数名,所以一个模板参数名在一个特定模板参数列表中只能出现一次。

默认模板实参

形参都有默认实参时,模板参数列表才能有默认实参。

模板默认实参与类模板

16.1.4成员模板

一个类(无论是普通类还是类模板)可以包含本身是模板的成员函数。称为成员模板,不能为虚函数。

类模板的成员模板

16.1.5控制实例化

显示实例化

16.2模板实参推断

从函数实参来确定模板实参的过程

16.2.1类型转换与模板类型参数

16.2.2函数模板显式实参

必须顺序是对,才能推断出。

如果显式的指定模板类型参数,就可以进行正常类型转换了。

16.2.4函数指针和实参推断

16.2.5模板实参推断和引用

从左值引用函数参数推断类型

模板类型参数一个普通(左值)引用只能传递给它一个左值(如一个变量或一个返回引用类型的表达式)

引用折叠和右值引用参数

编写接受右值引用参数的模板参数

拷贝还是绑定一个引用?

根据传入实参来确定是拷贝还是引用,传入左值是引用,右值则拷贝。

右值引用通常用于模板转发或模板被重载。

16.2.6理解std::move(不理解)

从一个左值static_cast到一个右值引用是允许的

16.2.7转发

定义能保持类型信息的函数参数

在调用中使用std::forward保持类型信息

头文件utility中,forward返回该显式实参类型的右值引用,即,forward的返回类型是T&&。

16.3重载与模板

匹配规则:

16.4可变参数模板

可以通过sizeof知道包的大小。

16.4.1编写可变参数函数模板

16.4.2包扩展

让扩展包中的元素作为单个元素供其他函数调用。

16.4.3转发参数包

使用forward来保持实参的原始类型

16.5模板特例化

一个特例化版本就是模板的一个独立定义,在其中一个或多个模板参数被指定为特定的类型。

定义函数模板特例化

一个特例化版本本质上是一个实例,而非函数名的一个重载版本。

类似其他任何类,可以在类内或类外定义特例化版本的成员。

���������������%�+��"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,504评论 1 51
  • C++ 模板简介 一、模板 使用模板的目的就是能够让程序员编写与类型无关的代码。 模板是一种对类型进行参数化的工具...
    MinoyJet阅读 2,341评论 0 12
  • C++文件 例:从文件income. in中读入收入直到文件结束,并将收入和税金输出到文件tax. out。 检查...
    SeanC52111阅读 2,751评论 0 3
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,139评论 9 118
  • 1.handler源码,handler Handler, Looper的理解 2.rxjava机制 rxjava ...
    简单爱呵呵阅读 215评论 0 0