前言:
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
請按任意鍵繼續. . .
當存在對應的普通函數時,優先調用普通函數