【模板显式、隐式实例化和(偏)特化、具体化的详细分析】

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


最近看了<The C++ Programing Language>看到了模板的特化,突然想起来<C++ Primer>上说的显式具体化、隐式具体化、特化、偏特化、具体化等概念弄得头晕脑胀,我在网上了找了好多帖子,才把概念给理清楚。
一下是我把再网上找的资料整理一下。
看着这么多叫法,其实就是三种。

  1. 显示实例化
  2. 隐式实例化
  3. 特化(=具体化)、偏特化

一、实例化

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【网络星空】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值