讨论这三者的区别我们要先认识函数模板,函数模板是C++新增的功能,他会创建一个通用的函数以支持多种不同类型的形参,避免函数体的重复设计,在我们需要重复用到某一段代码但是需要处理不同类型的参数时,使用函数模板是很方便的一个手段他最大的特点是把数据类型也作为了参数。每一个函数用一个函数模板,想让几个函数使用共同的模板参数,应当使用模板类
显示实例化:
template void Swap<int> (int ,int);
显示具体化:( 定义job为一个结构体 )
template <> void Swap<job> (job &,job &);
或 template<> void Swap (job &,job &);
从定义形式上我们可以看出区别在于前者以 template 打头,后者以template<> 打头
从含义上,显示具体化告诉编译器不要使用Swap()的函数模板来生成函数定义,而使用专门的job类型显式地定义函数定义 是为了提供一个具体化的函数定义,其中包括所需的代码,当编译器找到与函数调用匹配的具体化定义时,将使用该定义,而不再寻找模板,而显示实例化则是生成了一个指出特定参数类型的实例函数
综上所述:
隐式实例化:使用模板之前,编译器不生成模板的声明和定义示例,后面有程序用了,编译器才会根据模板生成一个实例函数,
显式实例化:是无论是否有程序用,编译器都会生成一个实例函数
显示具体化:因为对于某些特殊类型,可能不适合模板实现,需要重新定义实现,此时就是使用显示具体化的场景
注:函数模板可能在编译阶段会产生多个实例(每个编译单元都
会产生),但是在链接并产生最终的执行程序的阶段,只会产生一个实例。