C++ 模板函數和普通函數匹配規則

前言:

         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
請按任意鍵繼續. . .

當存在對應的普通函數時,優先調用普通函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章