首页天道酬勤C++模板(第二版)笔记之第十章:模板基本术语

C++模板(第二版)笔记之第十章:模板基本术语

admin 03-18 14:25 15次浏览


文章目录

第一,“类模板”或“模板类”

替换、实例化、特例化和特例化

模板的声明和定义

完整的类型和非完整的类型

唯一的定义法则

五、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++模板第二版》



C++并发编程总结 C++模板(第二版)笔记之第十八章:模板的多态性