C++ Templates读书笔记1-8章
来源:互联网 发布:linux ntp remote = 编辑:程序博客网 时间:2024/06/03 22:03
近期在阅读《C++ Templates》,由于英文实在不好,就选择了人民邮电出版社出版的中文版本,在此做读书笔记以备忘。
第一部分:模板基础
第2章:函数模板
1. 在声明引入类型参数的时候,不能使用struct代替typename; p10
2. 目前,函数模板不能指定缺省的模板实参 p13
3. 作为返回值得类型参数,必须显式指定; p14
4. 注意使用引用解决临时变量作为返回值的问题; p17
5. 一定要让函数重载的所有版本的声明位于调用之前。 p19
第3章:类模板
1. 何时用stack<T>何时用只用stack?前者表示类的类型,后者表示类名。 p23
2. 只有被调用的类模板成员才会产生函数的实例化代码。 p26
第4章:非类型模板参数
1. 函数模板被看成用于命名一组函数重载的集合,该集合不能用于模板参数的演绎,所以必须将这个函数模板的实参强制转换
成具体类型。 p37 **
2. 浮点数和类对象是不允许作为非类型模板参数的。p37
3. 全局指针不能作为类的非类型模板参数。p38
4. 具有外部链接属性的全局数组可以作为类的非类型模板参数。p37
第5章:技巧性基础知识
1. 在C++标准化过程中,引入typename是为了说明:模板内部的标识符可以是一个类型;p39
2. .template or ->template 表示调用成员模板依赖于外部的模板实参时,区分后面的<是模板实参的起始符号而不是小于号。 p41 *
3. 非依赖型名称会立即查找,但是模板是用到时才实例化,所以非依赖型名称不会在依赖型基类中进行查找。但可以通过this-> OR Base::限定符去延迟查找。 p41 p132
4. 函数模板支持模板的模板参数。 p47
5. 当把模板的模板参数定义为一个类时,不能用typename替换class。 p47
6. 把字符串当做模板的类型实参会出现意外的结果, const char[5] & const char[6]是不同的类型。 p52
7. 对于字符串,在实参演绎过程中,当且仅当参数不是引用时,才会出现数组到指针的类型转换,成为decay。 p55
第6章:模板实战
1. 编译器必须知道:应该实例化哪个定义和要基于哪个模板实参进行实例化。所以在使用分离模型时会出现如下情况:
看到调用时不知道定义是什么;看到定义时确又不知道基于什么实参进行实例化 p59
2. 1所述问题可以通过显示实例化进行解决;及在类的定义之后加上 template Stack<int>::func(); p 61
3. 可以在模板的声明和定义式前加上export,显示实例化。 p63 *
4. 预编译头文件 P68 ***
5. 模板调试 P70 ***
第7章:模板术语
1. 类模板,函数模板; P83
2. 实例化,特化。 p84
3. 一处定义原则- ODR p86
4. 模板参数,模板实参 -显式替换,隐式替换。 p87
5. 模板实参必须是一个可以在编译器确定的模板实体或值。 p87
第二部分:深入模板
第8章:深入模板基础
1. 联合(Union)模板也是允许的, template <typename T> union C{}; p93
2. 缺省调用实参可以依赖于模板参数。p93
3. 成员模板不能被声明为虚函数,因为实例化的个数要等到整个程序翻译完才能知道,而虚函数表的大小应该是固定的。 p94
4. 类模板不能和另一个实体拥有一个相同的名字,这一点不同于普通类。 p95
5. 模板名字是具有链接的,但是他们不能具有C链接,及extern "C"非法。 p95
6. 模板通常具有外部链接,唯一的例外就是前面有static修饰的函数模板。 p96
7. 非类型模板参数包括:整形或枚举,指针类型,引用类型。p97
8. 函数和数组在指定为模板参数前会隐式转换成指针类型。p98
9. 非类型模板参数智能是右值,不能被取址,不能被赋值。p98
10.模板的模板参数是代表类模板的占位符,不能使struct or union关键字。p98
11.模板的模板参数可以具有缺省参数,但是只有在实参没有指定的情况下才会应用。 p98
12.模板的模板参数的名称,只能被自身其它参数声明所使用,一般用不到可以省略。 p99
13.目前只有类模板可以声明缺省的模板实参,函数模板则不行,缺省值可以在前面的几个声明中提供,但要注意顺序,且不能重复声明缺省实参。p100
14.template-id : 模板名称+<实参列表> p100
15.注入式类名称: 在拥有模板参数P1, P2的类模板X的作用域内,模板名称X等同于他的Template-id; p100
16.显式指定的模板参数<int>会阻止该模板参数的演绎。 p101
17.函数模板的返回值模板参数,永远得不到演绎,所以需要显式指定。p101
18.SFINAE(substitution failure is not an error)替换失败并不是一个错误。p102
19.SFINAE保护原则:试图创建无效的类型,但是并不允许试图计算无效的表达式,如:p103
template<int I> void f(int (&)[24/4-I])
template<int I> void f(int (&)[24/4+I])
int main(){ &f<4> };
20.局部类和局部枚举不能作为模板的类型实参。p103
21.未命名的class类型或者未命名的枚举类型不能作为模板的类型实参。如:
typedef enum{ red, green } *ColorPtr;
List<ColorPtr> error; // 因为typedef定义的是*ColorPtr而不是 ColorPtr; p104 **
22.非类型模板参数只包括:
1) 某一个具有正确类型的非类型模板实参
2) 一个编译器期整形、枚举常值。类型需要能够匹配,或者可以隐式类型转换。
3) 前面有单目运算符&的外部变量或者函数名称。其中函数和数组的&可以省略。
4) 对于引用型的非类型模板参数,前面没有&的外部变量和外部函数也是可取的。
5) 一个指向成员的指针常量(pointer-to-member constant);类似于&C::m;p105 **
26.类的静态成员是可取的外部变量和函数名称。 p106
27.不能作为模板非类型实参的包括
1) 空指针常量。
2) 浮点型常量
3)字符串 p106
28.几个error
1) 派生类到基类的类型转换不考虑。
2) 域运算符(.)后面的变量不会被看成常量。
3) 单一数组的地址是不可取的。 p107
29.“模板的模板参数”必须是一个类模板,所以只能用class定义type;p107
30.模板的模板实参的缺省的模板实参不予考虑; p107
31.模板的模板参数的缺省的模板实参是被考虑的;p107
32.对于用关键字class声明的模板类型参数,我们可以用满足条件的任何类型作为它的替换实参,struct union等等。p108
33.成员模板不可能是一个虚函数;p109
34.构造函数模板一定不是一个默认的构造函数。 p109
35.从函数模板实例化出来的函数一定不是一个普通函数。 p109 **那全特化呢?
36.友元的首次声明在类模板中,则它在该类的外围域不可见。这点不同于普通类。 p110
37.通过确认紧跟在友元函数名称后面的一对尖括号,我们可以把函数模板的实例声明为友元。 p110
38.如果名称不是受限的,那么该名称不能引用一个模板(没有尖括号),如果友元声明的地方匹配不到普通函数,则该声明为首次声明,此时可以具有定义; p111
39.如果名称是受限的,该名称必须引用一个之前位置的函数模板或者普通函数,优先匹配模板。且不能出现定义。p111
40.在模板内部定义的友元函数类型定义中,必须包含类模板的模板参数,以防止重定义。p112
41.由于函数的实体定义在类内部,所以这些函数是内联的,因此两个不同的翻译单元可以生成相同的函数。p113
42.可以声明友元模板。只有在友元模板的声明是一个(1)非受限(2)后面没有尖括号的情况下,才能出现定义。
- C++ Templates读书笔记1-8章
- c++ Templates读书笔记 9-12章
- C++ Templates读书笔记1__函数模板
- 【c++ templates读书笔记】【1】函数模板
- 《C++ Templates》读书笔记
- 转:《C++ Templates》读书笔记
- 《C++Templates》第二章-初探函数模板
- 《Effective C++》读书笔记之item44:将与参数无关的代码抽离templates
- C++templates简单基础--Function Templates
- 《C++ Templates》读书笔记的一点补充
- 【c++ templates读书笔记】【2】类模板
- 【c++ templates读书笔记】【4】技巧性基础知识
- 【c++ templates读书笔记】【5】模板实战
- 【c++ templates读书笔记】【7】模板元编程
- C++ function templates(1)---《C++ Templates》
- C++ Templates笔记 1
- Templates
- templates
- Java的Web框架 Firefly Framework
- 用数据线连接手机,使用java程序控制手机发短信,打电话
- 开源项目几点心得,Java架构必会几大技术点
- jquery sortable的拖动方法讲解
- 【LeetCode】N-Queens && 【九度】题目1140:八皇后
- C++ Templates读书笔记1-8章
- 在iOS上使用ffmpeg播放视频
- 打开注解是对的,关闭是错的使用ThreadLocal实例
- JavaScript对象字面量
- Codeforces Round #213 (Div. 2)(矩阵)
- mysql在linux下诸多稀奇古怪的错误
- 网络编程
- 脸书收购链接分享服务Branch
- ifconfig eth0 up/down与ifup/ifdown eth0的区别