最近看了<The C++ Programing Language>看到了模板的特化,突然想起来<C++ Primer>上说的显式具体化、隐式具体化、特化、偏特化、具体化等概念弄得头晕脑胀,我在网上了找了好多帖子,才把概念给理清楚。
一下是我把再网上找的资料整理一下。
看着这么多叫法,其实就是三种。
- 显示实例化
- 隐式实例化
- 特化(=具体化)、偏特化
一、实例化
1.显示、隐式实例化
什么是实例化: 一个通过使用具体值替换模板参数,从模板产生的普通类,函数或者成员函数的过程。
显示实例化: 通过名字可见,就是清楚的表明你要实例化的类型
隐式实例化: 通过编译器自己推测判断要实例化的类型。
比如一个模板:
template<class T> //函数模板实现
void swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
a. 显示实例化
template void swap(); // 无须给该函数重新编写函数体,这只是个声明
为什么要显示实例化?
主要是提高效率,当显式实例化模板时,在使用模板之前,编译器根据显式实例化指定的类型生成模板实例,这样就相当于本程序里面有个一
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
这样的话,每次需要调用 swap(a,b)的时候每次都重新生成该类型的代码,可以节省空间,也能提高效率。这就是为什么要是显式的实例化的原因。
b. 隐式实例化
隐式实例化指的是:在使用模板之前,编译器不生成模板的声明和定义实例。只有当使用模板时,编译器才根据模板定义生成相应类型的实例。
int i

本文详细分析了C++中的模板实例化,包括显式和隐式实例化,以及模板的特化和偏特化。显式实例化能提高效率,隐式实例化则由编译器推测。模板特化用于处理特殊情况,偏特化针对模板的部分参数。文章还介绍了模板匹配顺序,即先查找显式实例化,然后特化,再偏特化,最后隐式实例化。
最低0.47元/天 解锁文章
5633

被折叠的 条评论
为什么被折叠?



