函数模板是一个独立于类型的函数,可作为一种方式,产生函数的特定类型版本。
在函数模板形参表中,关键字typename和class具有相同涵义。使用typename更为直观。
如果要在模板内部定义指定类型,可以在成员名前加上关键字typename
模板形参不必都是类型。在调用函数时非类型形参将用值代替,值的类型在模板形参表中指定。
编写泛型代码的两个重要原则:
1.模板的形参是const引用
2.函数体中的测试只用<比较
编译模板时,编译器可能会在三个阶段中标识错误:
1.编译模板定义本身时,语法错误
2.编译器见到模板的使用时
3.实例化的时候,发现类型相关的错误
类模板总是包含模板实参
从函数实参确定模板实参的类型和值的过程叫做模板实参推断。必须保证所有实参类型完全匹配,编译器为了匹配实参只能执行的受限转换:const转换、数组或函数到指针的转换。
当不能推断模板实参类型的时候,有必要覆盖模板实参推断机制,并显式指定为模板形参所用的类型或值。
包含编译模型:编译器必须看到用到的所有模板的定义。include
分别编译模型:编译器会为我们跟踪相关的模板定义。export
非类型形参的模板实参必须是编译时常量表达式。
泛型句柄类提供类似指针的操作:复制句柄对象将不会复制基础对象,复制之后,两个句柄对象将引用同一基础对象。
模板特化是指该定义中一个或多个模板形参的实际类型或实际值是指定的。