当前位置:编程学习 > C/C++ >>

第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++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,