您的位置:首页 > 编程语言 > C语言/C++

C++ 模板函数和普通函数匹配规则

2017-07-26 23:32 260 查看

前言:

         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

请按任意键继续. . .

当存在对应的普通函数时,优先调用普通函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: