本文参考文章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<