C++ 函数模板的 显式具体化,隐式\显式具体化小结

本文总结了C++中的函数模板实例化、显式具体化和编译器的重载解析。隐式实例化发生在调用时,由编译器根据参数类型生成函数实例。显式实例化则允许程序员指定模板实例化类型,分为声明和使用时显式实例化两种形式。显式具体化用于为特定类型提供独立的函数定义,解决模板无法满足的场景。编译器在重载解析时优先选择非模板函数,然后是显式具体化的模板函数,最后是常规模板函数。注意,显式实例化和显式具体化在同一转换单元中不能同时存在。
摘要由CSDN通过智能技术生成

这两天读到C++ Primer Plus第八章函数探幽部分,发现函数模板这里有一点点绕,因此写篇稿做下小结:

1.实例化

我们知道,声明一个函数模板后:

template<typename T>
void Swap(T&, T&)
{
   
	T temp;
	temp=a;
	a=b;
	b=temp;
}

在代码中并不会立刻生成函数,它只是一个用于生成函数定义的方案。
如果定义两个int型变量a,b

int a,b;

则调用Swap(a,b)时才会生成这个函数的实例,此时生成的函数实例为:

void Swap(int& a, int& b)
{
   
	int temp;
	temp=a;
	a=b;
	b=temp;
}

因为传入的两个参数为int型变量,这种靠传入参数由编译器自主判断生成函数实例的方式称为隐式实例化
这种方式很好理解,下面来谈谈显式实例化

见名知义,这种方式是直接告诉编译器要生成什么样的实例,有两种声明方法:
①:使用显式实例化声明:

template<typename T>
void Swap(T&, T&)
{
   
	T temp;
	temp=a;
	a=b;
	b=temp;
}

int main()
{
   
	template void Swap<int>(int&,int&);
	//.................
	.......代码段........//
}

直接告诉编译器模板中的T为int类型。
(说实话,我不知道这种方式有什么用……不推荐使用)
②:在使用函数的时候直接创建显式实例化(推荐)

template<typename T>
T add(T a, T b)
{
   
	return a+b;
}

int main()
{
   
	double a=2.5;
	double b=3.5;
	cout<<"a+b="<<add
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值