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
请按任意键继续. . .

当存在对应的普通函数时,优先调用普通函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值