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
请按任意键继续. . .
当存在对应的普通函数时,优先调用普通函数
相关文章推荐
- [笔试题 5][c/c++]模板函数和普通函数的调用优先顺序
- C++普通函数与模板函数以及特化函数重载的优先级问题
- C++中的虚函数的隐藏规则
- 【C++提高】函数重载的参数匹配问题
- C++学习笔记五——函数重载(多态)、函数模板及函数模板重载和完全匹配与最佳匹配
- C++调用约定及函数名修饰约定规则
- 如何实现虚函数的规则(VC中 C++ virtual 编译规则)
- 【转载】C++ 编译器的函数名修饰规则
- C++ 函数重载和匹配
- C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
- C++将普通函数声明为友元函数
- c++中关键字static在普通变量及函数详解及实例运行答案
- C++学习笔记22,普通函数重载(1)
- C++ 函数调用的匹配顺序
- C++的同名属性(没有虚拟属性)、同名普通函数、同名静态函数(没有虚拟静态函数),是否被覆盖
- C++中模板类使用友元模板函数 和友员非模版函数!使用不当出现编译错误:无法解析的外部符号…
- 6.Lua调用c++函数传递普通参数
- socket编程必备函数:字节序转换C++模板函数,一劳永逸地代替ntoh或hton等函数
- 排序算法,基本的高级语言都有一些提供。C语言有qsort()函数,C++有sort()函数,java语言有Arrays类(不是Array)。用这些排序时,都可以写自己的排序规则。
- C++ 中sort 函数及 cmp 自定义规则的使用