第16章 模板与泛型编程(5)
16.2 实例化
模板是一个蓝图,它本身不是类或函数。编译器用模板产生指定的类或函数的特定类型版本。产生模板的特定类型实例的过程称为实例化。
模板在使用时将进行实例化,类模板在引用实际模板类类型时实例化,函数模板在调用它或用它对函数指针进行初始化或赋值时实例化。
1. 类的实例化
类模板的每次实例化都会产生一个独立的类类型。为int类型实例化的Queue与任意其他Queue类型没有关系,对其他Queue类型的成员也没有特殊的访问权。
2. 类模板形参是必需的
类模板不定义类型,只有特定的实例才定义了类型。特定的实例化时通过提供模板实参与每个模板形参匹配而定义的。模板实参在用逗号分隔并用尖括号括住的形参表中指定。
Queue<int> qi;
Queue<string> qs;
Queue<int> qi;
Queue<string> qs;3. 函数模板实例化
使用函数模板时,编译器通常会为我们推断模板实参。
16.2.1 模板实参推断
从函数实参确定模板实参的类型和值的过程叫做模板实参推断(template argument deduction)。
1. 多个类型形参的实参必须完全匹配
2. 类型形参的实参的受限转换
编译器只会执行两种转换:
const转换:接受const引用或const指针的函数可以分别用非const对象的引用或指针来调用,无需产生新的实例化。如果函数接受非引用类型,形参类型和实参都忽略const。
数组或函数到指针的转换:如果模板形参不是引用类型,则对数组或函数类型的实参应用常规指针转换。数组实参将当作指向其第一个元素的指针,函数实参当作指向函数类型的指针。
3. 应用于非模板实参的常规转换
类型转换的限制只适用于类型为模板形参的那些实参。
4.模板实参推断与函数指针
可以使用函数模板对函数指针进行初始化或赋值,这样做的时候,编译器使用指针的类型实例化具有适当模板实参的模板版本。
16.2.2 函数模板的显式实参
1.指定显式模板实参
2. 在返回类型中使用类型形参
3. 显式实参与函数模板的指针
摘自 xufei96的专栏
补充:软件开发 , C++ ,