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

举报
AI浩 发表于 2021/12/23 00:04:44 2021/12/23
【摘要】 在模板函数和普通函数重载时,C++编译器对函数的调用规则如下: 当函数模板和普通函数都符合调用时,优先选择普通函数。如果想显示使用函数模板,则使用<>类型列表。如果函数模板能产生更好的匹配,则使用函数模板。函数模板不允许自动类型转化,普通函数能够进行制动类型转换。 规则一使用举例: #include <iostre...

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

  1. 当函数模板和普通函数都符合调用时,优先选择普通函数。如果想显示使用函数模板,则使用<>类型列表。
  2. 如果函数模板能产生更好的匹配,则使用函数模板。
  3. 函数模板不允许自动类型转化,普通函数能够进行制动类型转换。

规则一使用举例:

#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; //若显示使用函数模板,则使用<> 类型列表

}

运行结果:

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

第二次调用时,在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; //重载

}

运行结果:

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//调用普通函数 可以隐式类型转换

}

运行结果:

a可以隐式转化为ASCII对应的int数值,所以会优先使用普通函数。

文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。

原文链接:wanghao.blog.csdn.net/article/details/108975440

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。