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 }
  • 相关阅读:
    最近积累的JS 东西,分享一下
    C#定时任务框架Quartz.NET
    如何成为微软社区MVP以及年终总结
    git 基于某个分支创建分支
    iframe跨域-Js通信的一种方式
    tcp连接建立断开过程及状态变化
    MySQL-InnoDB的事务隔离与锁
    MySQL索引原理总结
    php gd实现简单图片验证码与图片背景文字水印
    php 取post数据的三种方式
  • 原文地址:https://www.cnblogs.com/jswu-ustc/p/8508844.html
Copyright © 2011-2022 走看看