所谓的函数模板的重载是指,普通函数的版本,函数模板的版本和函数模板特例化的版本可以共存,例如:
//普通函数版本
bool Compare(char* a, char* b)
{
cout << "普通函数版本" << endl;
return strcmp(a, b) > 0;
}
//函数模板版本
template<typename T>
bool Compare(T a, T b)
{
cout << "函数模板版本" << endl;
return a > b;
}
//模板特例化版本
template<>
bool Compare(char* a, char* b)
{
cout << "模板特例化版本" << endl;
return strcmp(a, b) > 0;
}
上述这三个Compare函数可以共存,而他们的调用优先级是:
普通函数版本>模板特例化的版本>模板版本,并且调用时要满足精确匹配的规则。例如:
#include<iostream>
using namespace std;
//普通函数版本
bool Compare(char* a, char* b)
{
cout << "普通函数版本" << endl;
return strcmp(a, b) > 0;
}
//函数模板版本
template<typename T>
bool Compare(T a, T b)
{
cout << "函数模板版本" << endl;
return a > b;
}
//模板特例化版本
template<>
bool Compare(char* a, char* b)
{
cout << "模板特例化版本" << endl;
return strcmp(a, b) > 0;
}
int main()
{
Compare("hello", "world");
return 0;
}
当在主函数中调用Compare函数比较两个常量字符串"hello"和"world"的大小时,首先会按照调用优先级,先调用普通函数版本,但此时普通函数版本的两个形参的类型为char*,但调用点的形参的类型为const char*,不满足精确匹配的规则,因此会按照调用优先级,接着调用模板特例化版本,但此时模板特例化版本的两个形参的类型为char*,但调用点的形参的类型为const char*,不满足精确匹配的规则,因此会按照调用优先级,来调用函数模板版本,此时系统会用const char*来替换T,来进行实例化,最终进行处理。因此这里我们调用的是函数模板。
程序运行结果:
(2020.7.22 补充)
模板的编译方式:
在定义点只编译模板的头部
在调用点才实例化模板函数
所以函数模板的声明和定义都写在.h文件。