- 模板定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板参数的列表,用<>包围起来。
template(1)模板类型参数:int compare(const T& v1, const T& v2) { if (v1 < v2) return -1; if (v2 < v1)return 1; return 0; }
- 一般来说,我们可以将类型参数看作类型声明符,就像数据类型一样使用。
- 一个非类型参数表示一个值而非一个类型,一个非类型参数可以是一个整型,或者是一个指向对象或函数类型的指针或左值引用。
- 绑定到非类型整型参数的实参必须是一个常量表达式,绑定到指针或引用非类型参数的实参必须具有静态的生存期。
- 在模板定义中,模板非类型是一个常量值,在需要常量表达式的地方可以使用非类型参数,如指定数组大小。
- 函数模板可以声明为inline或者constexpr的,如同非模板函数一样。
template(4)编写类型无关的代码:inline T min (const T&,const T&);
泛型编程的两个重要原则:
- 模板中的函数参数是const的引用;
- 函数体中的条件判断仅使用<比较运算。
将函数参数设定为const的引用,确保函数可以用于不能拷贝的类型。
(5)模板编译:- 通常,当我们调用一个函数或者使用一个类类的的对象时,编译器只需要掌握函数的声明或者类的定义必须是可用的。所以一般将类定义和函数声明放在头文件中,而普通函数和类的成员函数的定义放在源文件中。
- 模板则不同,为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义,因此,模板的头文件通常既包含声明也包括定义。
- 类模板以关键字template开始,后跟模板参数列表。
- 类模板用来实例化类型,一个实例化的类型总是包含模板参数的。
- 一个类模板中的代码如果使用了另一个模板,通常将模板自己的参数当作被使用模板的实参。
- 类模板的成员函数本身是一个普通函数,但是每个实例化的类都有自己的成员函数,因此,类模板的成员函数和模板有相同的模板参数。因而定义在类模板之外的成员函数必须以关键字template开始,后接类模板参数列表。
- 默认情况下,对于一个实例化了的模板,其成员只有在使用时才被实例化。这一特性使得即使某种类型不能完全符合模板操作的要求仍能使用该类型实例化类。
- 在类模板自己作用域中,我们可以直接使用模板名而不提供实参。
- 当在类模板外定义其成员时,需要提供实参。
- 新标准中,可以为函数和类模板提供默认实参。
- 对于一个模板实参,只有当它的右侧的所有参数都有默认实参时,它才可以有默认实参。
- 一个类(普通或者类模板)可以包含本身是模板的成员函数。这种成员被称为成员模板,成员模板不能是虚函数。



