前言:
1、本文献给C++初学者,高手请绕道。
2、本文总结在有多个同名模板函数和同名普通函数的情况下,调用函数时的匹配规则。
3、本文测试环境VS2013
一、只有一个模板函数
先把测试代码贴上来:
#include <iostream>
#include <typeinfo>
using namespace std;
template <typename T>
T GetMax(T a, T b){
cout << typeid(T).name() << endl;
return a > b ? a : b;
}
int _tmain(int argc, _TCHAR* argv[])
{
char a = 'k';
char b = 'p';
cout << GetMax(&a, &b)<< endl;
return 0;
}
输出结果如下:
char *
k烫烫-沓糳?
请按任意键继续. . .
通过观察输出结果,可以看出:
1、调用函数时T的类型是char*
2、返回的也是一个char*。主意cout输出结果有乱码是正常现象。
二、有两个同名模板函数
还是先上代码:
template <typename T>
T GetMax(T a, T b){
cout << typeid(T).name() << endl;
return a > b ? a : b;
}
template <typename T>
T GetMax(T* a, T* b){
cout << typeid(T).name() << endl;
return *a > *b ? *a : *b;
}
int _tmain(int argc, _TCHAR* argv[])
{
char a = 'k';
char b = 'p';
cout << GetMax(&a, &b)<< endl;
return 0;
}
输出结果如下:
char
p
请按任意键继续. . .
在main函数中,我们的调用代码没有做任何改变,我们只是新增了一个同名模板函数。
但是观察本次程序输出结果,可以发现本次调用的模板函数是:
template <typename T>
T GetMax(T* a, T* b){
cout << typeid(T).name() << endl;
return *a > *b ? *a : *b;
}
所以我们可以得出这样一个结论:
同名模板函数构成重载关系,在调用时,根据实参类型,编译器会选择最匹配的模板函数进行实例化。
三、存在特化模板函数
代码如下:
template <typename T>
T GetMax(T a, T b){
cout << typeid(T).name() << endl;
return a > b ? a : b;
}
template <typename T>
T GetMax(T* a, T* b){
cout << typeid(T).name() << endl;
return *a > *b ? *a : *b;
}
template <>
char* GetMax(char* a, char* b){
cout << "特化版本:" << endl;
return *a > *b ? a : b;
}
int _tmain(int argc, _TCHAR* argv[])
{
char a = 'k';
char b = 'p';
cout << GetMax(&a, &b)<< endl;
return 0;
}
在这种情况下:多了一个特化版本的模板函数。我们先看下输出结果:
特化版本:
p
请按任意键继续. . .
可以得出结论:如果存在针对某一类型的特化版本时,会优先调用特化版本,比如在这里char*就有特化版本
四、存在同名普通函数
template <typename T>
T GetMax(T a, T b){
cout << typeid(T).name() << endl;
return a > b ? a : b;
}
template <typename T>
T GetMax(T* a, T* b){
cout << typeid(T).name() << endl;
return *a > *b ? *a : *b;
}
template <>
char GetMax(char* a, char* b){
cout << "特化版本:" << endl;
return *a > *b ? *a : *b;
}
char GetMax(char* a, char* b){
cout << "普通函数版本:" << endl;
return *a > *b ? *a : *b;
}
int _tmain(int argc, _TCHAR* argv[])
{
char a = 'k';
char b = 'p';
cout << GetMax(&a, &b)<< endl;
return 0;
}
普通函数版本:
p
请按任意键继续. . .
当存在对应的普通函数时,优先调用普通函数