zoukankan      html  css  js  c++  java
  • 函数模板遇上函数重载

    当函数模板的名称和普通函数的名称一样时,会发生函数重载。

     1 #include <iostream>
     2 using namespace std;
     3 
     4 //函数模板
     5 template <typename T>
     6 void myfun(T& x,T& y)
     7 {
     8     cout<<"我是函数模板"<<endl;
     9 }
    10 
    11 //普通函数
    12 void myfun(int a,char c)
    13 {
    14     cout<<"我是普通函数"<<endl;
    15 }
    16 
    17 int main()
    18 {
    19     int x=10;
    20     char y='Y';
    21 
    22     myfun(x,y);//两个输入参数类型不一样,且与普通函数的输入类型一致,调用的是普通函数
    23     myfun(y,x);//两个输入参数类型不一样,但与普通函数的输入类型不一致,调用的是普通函数,因为普通函数之间会有一个隐式的类型转换
    24     myfun(x,x);//两个输入参数类型一样,调用的是函数模板,函数模板的本质是类型参数化,将严格按照类型匹配,不会进行自动类型转换
    25 
    26     return 0;
    27 }

    关于函数模板和普通函数在一起出现时,有以下几个原则:

    1.函数模板可以像普通函数一样被重载;

    2.C++编译器优先考虑普通函数;

    3.如果函数模板可以产生一个更好的匹配,那么选择函数模板;

    4.可以通过空模板实参列表的语法限定编译器只能调用模板函数;

     1 #include <iostream>
     2 using namespace std;
     3 
     4 //函数模板
     5 template <typename T>
     6 T Max(T x,T y)
     7 {
     8     cout<<"调用的是函数模板 ";
     9     return x>y?x:y;
    10 }
    11 
    12 //函数模板的重载
    13 template <typename T>
    14 T Max(T x,T y,T z)
    15 {
    16     cout<<"调用的是函数模板的重载 ";
    17     return Max(Max(x,y),z);
    18 }
    19 
    20 
    21 //普通函数
    22 int Max(int x,int y)
    23 {
    24     cout<<"调用的是普通函数 ";
    25     return x>y?x:y;
    26 }
    27 
    28 
    29 int main()
    30 {
    31     int x=10;
    32     int y=20;
    33 
    34     cout<<Max(x,y)<<endl;//C++编译器优先调用普通函数
    35     cout<<Max<>(x,y)<<endl;//显示调用函数模板,调用的只能是函数模板
    36     
    37     cout<<Max(3.0,4.0)<<endl;//函数模板产生更好的匹配,将调用函数模板
    38     cout<<Max(3.0,4.0,5.0)<<endl;//重载
    39 
    40     cout<<Max('A',50)<<endl;//无法与函数模板相匹配,调用普通函数(函数参数的隐式转换)
    41 
    42     return 0;
    43 }
  • 相关阅读:
    关于DataGridView的数据源绑定字符串两个值得注意的问题
    .Net 第三方控件(转)
    sql语句linq语言lambda表达式对照
    InvokeRequired 属性 与Invoke方法
    .net垃圾回收机制
    const与readonly的区别
    Developer Express控件组合中的GridControl控件,如何自动显示每一行的序号
    XtraGrid控件6——2种GridColumn的属性
    如何让应用程序仅运行一个实例(c#)
    DevExpress控件之GridControl控件
  • 原文地址:https://www.cnblogs.com/jswu-ustc/p/8508844.html
Copyright © 2011-2022 走看看