本文参考文章2001 年 7 月的 C/C++ Users Journal,第 19 卷第 7 期:Why Not Specialize Function Templates? 大家有兴趣可以看看原文。
文章目录
- 一、 重载和特化
- 
   - 1. 重载
- 2. 特化
 
- 二、特化和重载的调用优先级
- 
   - 1. 第一份代码
- 2. 第二份代码
- 3. 原因
 
- 三、函数模板特化的书写格式
- 
   - 1. 单参的函数模板
- 2. 多参数的函数模板
- 
     - ① 全特化:全显式
- ② 全特化:显式 + 推演
 
 
- 四、总结:
- 
   - 1. 单参数的函数模板
- 2. 多参数的函数模板
 
首先我们来看一下我们待会儿要接触的主要内容:
 
一、 重载和特化
1. 重载
正如上面所写的,类不能重载,但函数可以重载,所以类模板没有重载,而函数模板是可以重载的。
//重载的两个函数模板
template<class T>
void sum(T a)
{
   
}
template<class T1,class T2>
void sum(T1 a, T2 b)
{
   
}
上面的两个函数模板就是重载的关系。
2. 特化
正如上面所写的,类模板可以全特化,也可以偏特化,而函数模板只能全特化,并不支持偏特化(语言不支持)。
//类模板
template <class T1,class T2>
class Date	    	//基础的类模板
{
   
};
template <class T1,class T2>
class Date<int,int> //类模板的全特化
{
   
};
template <class T1>
class Date<T1, int> //类模板的偏特化
{
   
};
//函数模板
template <class T>
bool Less(T left, T right)		//基础的函数模板 —— 为了方便描述,我么称它为 a
{
   
	cout << "Less(T left, T right)" << endl;
	return left < right;
}
template<>
bool Less<int>(int left, int right)	//函数模板的全特化
{
   
	return left < right;
}
template<class T>
bool Less<T*>(T* lp, T* rp)		//函数模板的偏特化,但不支持,会报错
{
   
	return *lp < *rp;
}
虽然函数模板并不支持偏特化,但可以通过重载实现偏特化的效果:
template <class T>
bool Less(T* p1, T* p2)		//基础的函数模板 —— 为了方便描述,我么称它为 b
{
   
	cout << "Less(T* p1, T* p2)" << endl;
	return *p1 < *p2;
}
这里,b<









![[Unity Demo]从零开始制作空洞骑士Hollow Knight第九集:制作小骑士基本的攻击行为Attack以及为敌人制作生命系统和受伤系统](https://i-blog.csdnimg.cn/direct/bcb57e5fa5d34dc8b711bbeef4420c9b.png)









