C++模板(第二版)笔记之第十章:模板基本术语
文章目录
第一,“类模板”或“模板类”
替换、实例化、特例化和特例化
模板的声明和定义
完整的类型和非完整的类型
唯一的定义法则
五、TemplateArgumentsversusTemplateParameters
六、总结
第一,“类模板”或“模板类”
classtemplate在本笔记中
术语classtemplate是指这个class是一个模板。也就是说,它是一组class的参数表达。
替换、实例化、特例化和特例化
模板实例化
用实际参数代替模板参数,从一个模板中创建一个常规类、类型别名、函数、成员函数或变量的过程,称为“模板实例化”。
特例化(specialization)
通过实例化或不完全实例化产生的实体通常被称为特例化(specialization)。
显式特例化(explicitspecialization),全特化
显式指定了一个与模板参数相关的声明,并被特别替换。
template <typename T1, typename T2> // primary class template
class MyClass
{
…
};
template <> // explicit specialization
class MyClass<std::string, float>
{
…
};
部分特化,偏特化
特例化之后依然还有模板参数, 就称之为部分特例化。
特例化之前的通用模板被称为主模板
template <typename T> // partial specialization
class MyClass<T, T>
{
…
};
template <typename T> // partial specialization
class MyClass<bool, T>
{
…
};
三、模板的声明和定义
模板的声明:
template<typename T>
void func (T);
模板的定义:
template<typename T>
class S {};
1.完整类型和非完整类型
非完整类型是以下情况之一:
一个被声明但是还没有被定义的 class 类型。
一个没有指定边界的数组。
一个存储非完整类型的数组。
Void 类型。
一个底层类型未定义或者枚举值未定义的枚举类型。
任何一个被 const 或者 volatile 修饰的以上某种类型。 其它所有类型都是完整类型
eg:不完整类型
class C; // C is an incomplete type
C const* cp; // cp is a pointer to an incomplete type
extern C elems[10]; // elems has an incomplete type
extern int arr[]; // arr has an incomplete type…c
eg:完整类型
lass C { }; // C now is a complete type (and therefore cpand elems
// no longer refer to an incomplete type)
int arr[10]; // arr now has a complete type
第四,法律的唯一定义
one是唯一定义法则的-definitionrule,ODR)
常规(如非模板)非inline函数和成员函数,以及非inline的全局变量和静态数据成
员工,在整个程序中只能定义一次。
Class类型(包括struct和union)、模板(包括部分特例化,但不是全特例化)、inline函数和变量只能在一个编译单元中定义一次,不同编译单元之间的定义应该相同。
编译单元是通过预处理源文件生成的文件;它包含#include指令和宏展开后的内容
五、TemplateArgumentsversusTemplateParameters
如果用double和10替换前者中的模板参数T和N,则与后者相同
无论这些参数是否与模板参数有关,模板名称及其后尖括号和模板参数都被称为
为template-id
//模板类
template <typename T, int N>
class ArrayInClass
{
public:
T array[N];
};
//类
class DoubleArrayInClass
{
public:
double array[10];
};
由于模板参数是编译期实体, 它们也可以被用作模板实参
其中 T 既是模板参数也是模板实参
template<typename T>
class Dozen {
public:
ArrayInClass<T,12> contents;
};
六、总结
我们称之为模板、函数模板和变量模板,它们是模板的类别。
模板实例化过程是用实参取代模板参数,从而创建常规类或函数的过程。最终产生的实体是特化。
类型可以是完整的或不完整的。
根据唯一的定义法则(ODR),在整个过程中,非inline函数、成员函数、全局变量和静态数据成员只能定义一次
ref:《C++模板第二版》