C++ 模板
创始人
2024-05-19 09:34:16
0

在学习stl之前,我们就已经略微讲解了一些模板的知识,而现在,我们来进一步了解一下模板的相关知识

初步了解


目录

一.   非类型模板参数

二.   模板的特化

全特化

偏特化

三.   模板分离编译

四.   总结


一.   非类型模板参数

模板参数分类类型形参与非类型形参。

在我们之前所使用到的模板参数都是类型形参,

而非类型形参就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。而非类型形参的的参数类型只能是整形

例如我们可以通过非类型模板参数来实现一个静态的数组

template
class array
{
public:
private:T _array[N];
};

而类型模板参数可以有缺省值,同样非类型模板参数也可以有缺省值

namespace szt
{templateclass array{public:array(){cout << sizeof(_array) / sizeof(T) << endl;}private:T _array[N];};void test1(){array arr;}
}int main()
{szt::test1();
}


二.   模板的特化

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理

全特化

字面意思就是将所有的模板参数进行特化

template
class Data
{
public:Data() { cout << "Data" << endl; }
};template<>
class Data
{
public:Data() { cout << "Data" << endl; }
};int main()
{Data d1;Data d2;
}

而在之前的模拟优先级队列中, 我们说过针对于自定义类型,需要自己写一个新的仿函数来完成自定义类型的比较,而我们也可以使用特化来实现比较 

偏特化

将模板参数类表中的一部分参数特化。

首先,就是可以特化一部分的模板参数

template
class Data
{
public:Data() { cout << "Data" << endl; }
};template
class Data
{
public:Data() { cout << "Data" << endl; }
};int main()
{Data d1;Data d2;
}

其次呢,也可以针对模板参数进行更进一步的条件限制

例如限制为指针、引用等等

template
class Data
{
public:Data() { cout << "Data" << endl; }
};template
class Data
{
public:Data() { cout << "Data" << endl; }
};int main()
{Data d1;Data d2;
}

 


三.   模板分离编译

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。

在我们之前所写的一些代码中,若是量较大,往往会将函数的声明放在头文件中,并在源文件中进行定义,这就是一种分离编译模式

那么模板能不能也采用我们在函数中所使用的方法呢?

在讨论这个问题之前,我们先了解一下程序的运行过程

主要分为四个阶段:预处理、编译、汇编、链接

首先预处理所处理的是头文件的展开、条件编译、宏定义、去除注释等问题,并将对应的源文件转换为.i类型的文件

而编译我们就比较熟悉了,是用来检查语法错误的,没有错误就将代码转为汇编语言,转为.s文件

汇编就是将汇编语言转换为二进制机器码,即.o文件

而链接是将多个源文件链接在一起,一个源文件若是想要使用所包含的头文件中声明的函数或类,就需要通过链接来使用

而若是将模板的声明与定义分离,往往会提示链接上出错,这是因为在编译的过程中,由于模板是在一个单独的源文件中进行定义,因此没有进行实例化,所以无法转为汇编语言,因此在使用时无法链接到对应的函数或者类。

而为了解决这个问题,我们有两种方法,其中一种就是在模板定义的位置显式实例化,而若是使用这种方法,需要我们每一种类型都需要进行一次显示实例化,不方便

而另一种解决方法就是将声明和定义都放在头文件中,这样,在编译的过程中,由于定义与使用在一个文件中(头文件的展开),所以就不需要进行链接,同时也可以进行实例化。


四.   总结

优点

1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生

2. 增强了代码的灵活性

缺陷

1. 模板会导致代码膨胀问题,也会导致编译时间变长

2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误
 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...