zoukankan      html  css  js  c++  java
  • C++语法小记---函数模板

    函数模板
    • 函数模板的目的是代码复用

    • 普通函数和模板函数可以形成重载,调时优先调用普通函数,其次调用模板函数

    • 模板函数要编译两次,第一次是具现出具体的函数,第二次是对具现出的函数进行编译

    • 函数模板调用特点:

      • 不进行隐式类型转换

      • 返回值不能进行自动推倒

      • 普通函数和模板函数形成重载时,可以显示的调用模板函数

    • 建议:将返回值类型作为第一个模板参数

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 template<typename T>
     7 void Swap(T& l, T& r)
     8 {
     9     T tmp = l;
    10     l = r;
    11     r = tmp;
    12 }
    13 
    14 template<typename T>
    15 T add(T l, T r)
    16 {
    17     cout<<"T add(T l, T r)"<<endl;
    18     return l + r;
    19 }
    20 
    21 int add(int l, int r)
    22 {
    23     cout<<"add(int l, int r)"<<endl;
    24     return l + r;
    25 }
    26 
    27 template<typename T1, typename T2>
    28 T1 func(T2 param)  //将返回值作为第一个参数类型
    29 {
    30     return static_cast<T1>(param);
    31 }
    32 
    33 int main()
    34 {   
    35     int a = 1;
    36     int b = 2;
    37     Swap(a, b);
    38     cout<<"a = "<<a<<endl;
    39     cout<<"b = "<<b<<endl;
    40     
    41     add(a, b);  //add(int l, int r), 优先调用普通函数
    42     add(1.1, 2.2); //T add(T l, T r), 普通函数不匹配,然后匹配模板函数
    43     
    44     add<>(a, b);      //显式调用模板函数
    45     add<int>(a, b);      //显式调用模板函数
    46     
    47     cout<<"func<int>(1.2) = "<< func<int>(1.2) << endl; //只指定返回值类型,参数类型自动推导
    48     
    49     return 0;
    50 }
    • 函数模板只能全特化,不能偏特化

    • 函数模板、特化模板以及普通函数可以构成重载,优先调用普通函数,其次调用特化模板,最后调用函数模板

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 template<typename T1, typename T2>        //函数模板
     7 void add(T1 l, T2 r)
     8 {
     9     cout << "void add(T1 l, T2 r)" << endl;
    10 }
    11 
    12 template<>
    13 void add<int>(int l, int r)              //全特化模板
    14 {
    15     cout << "void add<int>(int l, int r)" << endl;
    16 }
    17 
    18 void add(int i, int r)                    //普通函数
    19 {
    20     cout << "void show(int i, int r)" << endl;
    21 }
    22 
    23 int main()
    24 {
    25     int a = 0;
    26     int b = 1;
    27     double c = 2.5;
    28     
    29     add(a, b);   //void show(int i, int r)
    30     add<>(a, b); //void add<int>(int l, int r)
    31     add(a, c);   //void add(T1 l, T2 r)
    32     return 0;
    33 }
    • 在函数模板中,类型可以是参数, 变量也可以是参数
     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 template<typename T1, int N>        //函数模板
     7 void add(T1 l, T1 r)
     8 {
     9     cout << "result = " << l + r <<endl;
    10     cout << "N = " << N << endl;
    11 }
    12 
    13 int main()
    14 {
    15     add<int, 10>(1, 2);   //result = 3
    16                           //N = 10
    17     return 0; 
    18 }
  • 相关阅读:
    11.重写、抽象、接口、异常
    3.用户组、指令运行级别、帮助指令、文件目录类(一)
    2.vi和vim编辑器、vi和vim三种模式、vi和vim快捷键、关机、重启命令、用户管理
    1.VM和Linux系统(centos)安装、linux目录结构、远程登录到Linux服务器、远程上传下载文件xftp
    10.函数、流程控制
    9.变量、存储过程
    8.事务、视图
    7.库和表的管理、常见数据类型、常见约束、标识符
    CH6801 棋盘覆盖(二分图最大匹配)
    洛谷P1525 关押罪犯(二分图判定+二分)
  • 原文地址:https://www.cnblogs.com/chusiyong/p/11315494.html
Copyright © 2011-2022 走看看