第十六章 模板和泛型编程
1.和面向对象编程一样,泛型编程也可以处理编写程序时不知道类型的情况。前者可以处理运行前未知的情况,后者在编译时可知。
2.模板:template <typename T>,模板参数列表不可为空。类型参数T前面必须有calss或者typename.
3.模板参数列表里可以有非类型模板参数,它的实参必须是常量表达式。
4.模板程序应该尽量减少对实参类型的要求。
5.模板的头文件通常既包括声明也包括定义。模板直到实例化的时候才能生成代码。
6.在类外定义类模板的成员函数。必须以template接类模板参数列表开始,而且类名字必须包含模板实参。
7.类的成员函数只有在使用时才会被实例化。
8.在一个类模板的作用域内,可直接使用模板名称而不必制定模板实参。
9.可以将模板类型参数声明为友元。
10.模板类型别名, using语句。
11.类模板的static成员。
12.在模板内不能重用模板参数名。
13.当我们希望通知编译器一个名字表示类型时,必须使用关键字typename,否则编译器很难推断::作用域运算符后面是类型 成员还是static数据成员。
14.无论何时使用类模板,必须在模板名后面加尖括号,即使使用全部默认实参,也要加空的尖括号。
15.成员模板不能是虚函数。
16.类模板和其成员模板有各自独立的模板参数。在类模板外定义一个成员模板时,类模板参数列表在前,成员自己的模板参数列表在后,必须都有。
17.为了避免大系统中,多个文件中实例化相同模板的开销,显式实例化:extern template declaration. 实例化定义是:template declaration.编译器遇到extern模板声明时,不会在本文件中生成实例化代码。
18.unique_ptr是编译时绑定删除器,shared_ptr是运行时绑定删除器。
19.可以指定显示模板实参。
20.尾置返回类型可以处理不知道返回结果准确类型,且所需类型是所处理序列的元素类型的情况。
21.标准类型转换模板,例如使用remove_reference<T>::type可以把T脱引用。
22.我们可以使用函数模板来初始化一个函数指针或为一个函数指针赋值。
23.当函数参数是模板类型参数的左值引用时,只能传给他左值,实参可以是const类型,也可以不是。如果是const,则T会被推断是const类型。
24.引用折叠规则。
25.std::forward可以保持类型信息的函数参数。保持原始实参的类型。
26.理解包扩展。
27.我们无法将指针转为数组的引用。模板特例化。
26.当有多个版本的重载模板对一个调用提供同样好的匹配时,选择最特例化的版本。
27.非函数模板优先级比函数模板高。
28.可变参数模板,模板参数包和函数参数包。typename...。