模板函数和普通函数重载时的调用规则

简介: 模板函数和普通函数重载时的调用规则

在模板函数和普通函数重载时,C++编译器对函数的调用规则如下:


当函数模板和普通函数都符合调用时,优先选择普通函数。如果想显示使用函数模板,则使用<>类型列表。

如果函数模板能产生更好的匹配,则使用函数模板。

函数模板不允许自动类型转化,普通函数能够进行制动类型转换。

规则一使用举例:

#include <iostream>


using namespace std;



int Max(int a, int b)


{


   cout << "int Max(int a, int b)" << endl;


   return a > b ? a :b;


}


template<typename T>


T Max(T a, T b)


{


   cout << "T Max(T a,T b)" << endl;


   return a > b ? a : b;


}


template<typename T>


T Max(T a, T b, T c)


{


   cout << "T Mac(T a,T b,T c)" << endl;


   return Max(Max(a, b), c);


}


int main()


{


   int a = 1;


   int b = 2;


   cout << Max(a, b) << endl; //当函数模板和普通函数都符合调用时,优先选择普通函数


   cout << Max<>(a, b) << endl; //若显示使用函数模板,则使用<> 类型列表


}


运行结果:


tt.png

第一次调用时,函数模板和普通函数都符合调用条件,优先选普通函数。


第二次调用时,在Max后面加上了<>,则强制使用函数模板,所以会调用函数模板


规则二使用举例:



#include <iostream>


using namespace std;



int Max(int a, int b)


{


   cout << "int Max(int a, int b)" << endl;


   return a > b ? a :b;


}


template<typename T>


T Max(T a, T b)


{


   cout << "T Max(T a,T b)" << endl;


   return a > b ? a : b;


}


template<typename T>


T Max(T a, T b, T c)


{


   cout << "T Mac(T a,T b,T c)" << endl;


   return Max(Max(a, b), c);


}


int main()


{


   cout << Max(3.0, 4.0) << endl; //如果 函数模板产生更好的匹配 使用函数模板


   cout << Max(5.0, 6.0, 7.0) << endl; //重载


}


运行结果:

tt.png

float转为int时会有精度的损失,所以普通函数不能匹配,这个时候只能选择函数模板。


规则三使用举例:

#include <iostream>


using namespace std;



int Max(int a, int b)


{


   cout << "int Max(int a, int b)" << endl;


   return a > b ? a :b;


}


template<typename T>


T Max(T a, T b)


{


   cout << "T Max(T a,T b)" << endl;


   return a > b ? a : b;


}


template<typename T>


T Max(T a, T b, T c)


{


   cout << "T Mac(T a,T b,T c)" << endl;


   return Max(Max(a, b), c);


}


int main()


{


   cout << Max('a', 100) << endl;  //调用普通函数 可以隐式类型转换


}


tt.png

目录
相关文章
|
18天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
13 3
|
18天前
|
编译器
函数重载和重载函数有什么区别
【10月更文挑战第19天】函数重载和重载函数有什么区别
27 2
|
5月前
|
SQL 人工智能 算法
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
|
6月前
|
开发者 C++
41重载运算符的规则
41重载运算符的规则
24 0
|
弹性计算 JavaScript 编译器
函数类型-3:函数重载
本实验将介绍TypeScript中的函数重载
函数类型-3:函数重载
|
算法 编译器 C语言
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(下)
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(下)
|
存储 编译器 C++
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(上)
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(上)
|
编译器 C++
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(中)
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(中)
函数的重载
函数的重载
29 0
函数重载&函数默认参数
函数重载&函数默认参数
38 0