C++编程语言关于模板的学习笔记

C++编程语言关于模板的学习笔记

  • 1.模板函数
    • 1.1基本概念
    • 1.2模板函数推演示例:
    • 1.3区分完全泛化、部分特化以及完全特化
    • 1.4注意点:
  • 2.模板类
    • 2.1模板类编译时的推演规则
    • 2.2可以有非类型,并且当我们的N为不同的值的时候,对象类型也会不同
    • 2.3类模板中函数的编译问题
    • 2.4模板类型参数可以赋默认值
    • 2.5模板类型参数可以有多个
    • 2.6什么时候是模板类型
    • 2.7类型萃取问题引入

1.模板函数

1.1基本概念

模板是在编译时期产生代码,它的执行并不是宏的替换,而是重命名规则

//传参后,模板函数编译时候如下,而不是将Type替换为int
typedef int Type;
void Swap<int>(Type& a,Type& b)
{
Type tmp=a;
a=b;
b=tmp;
}

而下面的N是一个宏替换,替换一个常量,
C++编程语言关于模板的学习笔记_第1张图片

1.2模板函数推演示例:

通过下面的示例中传入的不同参数,我们来分析一下在编译时期T被推演为什么?(注释已经给出推演的结果)
示例1:
C++编程语言关于模板的学习笔记_第2张图片
示例2:
C++编程语言关于模板的学习笔记_第3张图片
示例3:
C++编程语言关于模板的学习笔记_第4张图片
示例4:
C++编程语言关于模板的学习笔记_第5张图片

1.3区分完全泛化、部分特化以及完全特化

C++编程语言关于模板的学习笔记_第6张图片

1.4注意点:

①因为引用(&)的底层是int * const (常性指针),传引用进去之后,编译器对于int* 之后的const无法进行推演,所以编译不通过。
C++编程语言关于模板的学习笔记_第7张图片
所以我们需要在模板函数中T的后面手动加上const
C++编程语言关于模板的学习笔记_第8张图片

②模板函数也是可以重载的
C++编程语言关于模板的学习笔记_第9张图片

2.模板类

2.1模板类编译时的推演规则

给类名称后面加上T的具体类型
然后在类内用typedef给这个具体类型重命名为T
C++编程语言关于模板的学习笔记_第10张图片

2.2可以有非类型,并且当我们的N为不同的值的时候,对象类型也会不同

比如下面的N分别为100,10,在进行替换之后,会实例化出两个不同的对性(原因是成员属性都不相同,因此就是不同的对象)。

C++编程语言关于模板的学习笔记_第11张图片

2.3类模板中函数的编译问题

类模板中的函数,如果调动了,类模板里面的函数才会参与编译,不调动就不会参与编译

所以下面将N的值改变,如果我们不调用是并不会检测出错误的。
C++编程语言关于模板的学习笔记_第12张图片

2.4模板类型参数可以赋默认值

C++编程语言关于模板的学习笔记_第13张图片

2.5模板类型参数可以有多个

C++编程语言关于模板的学习笔记_第14张图片

2.6什么时候是模板类型

Arrayiat,因为已经明确的给出一个整型,所以编译器就会实例化出具体的内容,那么这就是一个具体的类型

Array 这就是一个模板类型,因为没有给出明确的类型,编译器无法做出判断要处理怎样的类型。

template<class T>
class Array
{
   enum{INIT=10};
   T* data;
   size_t capacity;
   size_t count;
};
int main()
{
    Array<int>iar;//这不是一个模板类型,因为编译器会把它实例化为下面的代码:
    /*
    class Array
    {
       typedef int T;
       enum{INIT=10};
       T* data;
       size_t capacity;
       size_t count;
    };
    */
    Array//这是一个模板类型
}

2.7类型萃取问题引入

T是一个类型,

seq是一个类型,此类型能够接收的必须是一个模板类型,此模板类型必须带有一个模板参数

如果说在主函数的使用中,出现这样的情况:

Containercontatiner;

那么这就会导致Array这不是一个模板类型,变成具体的设计类型,所以应该变成这样:Containercontatiner;
C++编程语言关于模板的学习笔记_第15张图片

如何类型萃取,能够将T明确出来是int类型呢?

不要直接把程序中的T全部换成int,或者其他具体的类型,这是枯燥的,因此需要类型萃取。
C++编程语言关于模板的学习笔记_第16张图片

你可能感兴趣的:(C/C++,c++,开发语言,后端)