本文共 1270 字,大约阅读时间需要 4 分钟。
1. 模板定义以template开始,后接模板形参表(<>),模板形参表不能为空。
2. 模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参。
3. 函数模板可以用与非函数模板函数一样的方式声明为inline,inline说明符放在模板形参表之后、返回类型之前。
4. 在函数模板形参表中,关键字typename和class具有相同含义,可以互换使用。
5. 编写泛型代码的两个重要原则:
模板的形参是const引用。
函数体中的测试只用<来比较。
6. 可以使用函数模板对函数指针进行初始化或赋值。这么做的时候,编译器使用指针的类型实例化具有适当模板实参的模板版本。
template <typename T>
int compare(const T&, const T&);
int (*pf1) (const int&,const int&)=compare;
pf1是一个函数指针,指向一个接受两个constint&形参并返回int值的函数。
7. 可以显式调用模板实参。在函数名之后,实参表之前加<>表示的实参列表。
8. 编译类型:包含编译类型、分别编译类型。
export关键字:
9. 类模板成员函数的定义:
template <class T>
ret-type Class_Name<T>::member-name(…)
类模板成员函数只有在为程序所用的时候,才进行实例化,如果从未使用,则不会实例化。
当成员函数也是模板时,它的定义必须包含类模板形参以及自己的模板形参。首先是类模板形参表,然后是成员自己的模板形参表。
template <class T1>
template <class T2>
ret-type Class_Name<T1>::member-name(…)
10. 编译器会将友元声明也作为类或函数的声明来对待。
11. 模板特化:该模板定义中一个或多个模板形参的实际类型或实际值是指定的。定义格式如下:
template 后接一堆空尖括号,再接函数名和尖括号,该尖括号中指定特化的模板形参,然后是函数名和函数体。
template <>
ret-type foo<type A>(…){}
模板特化也可以声明而不定义。
如果程序由多个文件构成,则模板特化的声明必须在使用该特化的每个文件中出现。可以将声明包含在头文件中。
12. 类模板特化可以定义与模板本身完全不同的成员。
13. 在类特化外部定义成员时,成员之前不能加template<>标记。
14. 类模板的部分特化,只特化部分形参:
template<不特化的形参列表>
class Class_Name<不特化和特化的形参列表>{…}
部分特化的定义与通用模板的定义完全不会冲突。部分特化可以具有与通用类模板完全不同的成员集合。
15. 函数模板可以重载,可以定义有相同名字,但形参数目或类型不同的多个函数模板。也可以定义与函数模板有相同名字的普通非模板函数。
16. 如果有二义性,普通函数的优先级大于模板函数。
转载地址:http://dwbdi.baihongyu.com/