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

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

在模板函数和普通函数重载时,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

目录
相关文章
|
9月前
|
弹性计算 JavaScript 编译器
函数类型-3:函数重载
本实验将介绍TypeScript中的函数重载
46 4
函数类型-3:函数重载
|
8月前
|
算法 编译器 C语言
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(下)
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(下)
|
8月前
|
存储 编译器 C++
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(上)
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(上)
|
8月前
|
编译器 C++
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(中)
【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式(中)
|
9月前
函数的重载
函数的重载
21 0
|
编译器 Linux C语言
c++关键字,命名空间,缺省参数,函数重载,引用,内联函数auto等学习(上)
c++关键字,命名空间,缺省参数,函数重载,引用,内联函数auto等学习(上)
108 0
|
存储 安全 编译器
c++关键字,命名空间,缺省参数,函数重载,引用,内联函数auto等学习(下)
c++关键字,命名空间,缺省参数,函数重载,引用,内联函数auto等学习(下)
93 0
|
编译器 C语言 C++
【C++入门必备知识:缺省参数+函数重载+函数名修饰规则】
当调用该函数时,如何没有没有指定实参则采用改形参的默认值。
102 0
|
存储 编译器 C++
【C++】右值引用和移动语义 | 新的类功能 | 可变参数模板(上)
【C++】右值引用和移动语义 | 新的类功能 | 可变参数模板(上)
【C++】右值引用和移动语义 | 新的类功能 | 可变参数模板(上)