• c++/oop函数模板


    c++/oop---模板

    函数模板

    举例:swap

    template <class c1,class c2 , ...>

    返回值类型 模板名(形参表){

    }

    template<class T>

    void swap (T & x, T & y){

           T tmp=x;x=y;y=tmp;

    }

    编译器在编译的时候回由模板自动生成函数,称作模板的实例化,得到的函数成为模板函数.

    不通过参数实例化模板

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    template <class T>
    T inc(int n){
    	return 1+n;
    }
    int main()
    {
    	cout<<inc<double>(4)/2<<endl;
    	return 0;
    }

    相当于指定 T 是 double ,这时一定需要指定。(否则不知道 T 是啥类型)

    函数模板可以重载,只要它们的形参表或类型参数表不同即可。 

    在有多个函数和函数模板名字相同的情况下,编译器如下处理一条函数
    调用语句
    1 先找参数完全匹配的普通函数(非由模板实例化而得的函数)。
    2 再找参数完全匹配的模板函数。
    3 再找实参数经过自动类型转换后能够匹配的普通函数

    4 上面的都找不到,则报错。

    参数不一定要是变量,甚至可以是函数

    #include <iostream>
    2 using namespace std;
    3 template<class T,class Pred>
    4 void Map(T s, T e, T x, Pred op) {
    5 for(; s != e; ++s, ++x) {
    6 *x = op(*s);
    7 }
    8 }
    9 int Cube(int x) {
    10 return x * x * x;
    11 }
    12 double Square(double x) {
    13 return x * x;
    14 }
    
    int a[5] = {1,2,3,4,5}, b[5];
    8 Map(a, a+5, b, Square); 
    9 void Map(int * s, int * e, int * x, double ( *op)(double)) {
    10 for(; s != e; ++s,++x) {
    11 *x = op(*s);
    12 }
    13 }
    template <class T1, class T2, class T3>
    2 T1 func(T1 * a, T2 b, T3 c) { }
    3 int a[10], b[10];
    4 void f(int n) { }
    func(a, b, f); 
    
    将模板类型参数实例化的结果是:
    A T1: int, T2: int *, T3: void (*) (int)

    void (*) int 表示返回值为 void 参数表为 int 的一个函数指针

      

  • 相关阅读:
    ASP.NET MVC Model元数据(三)
    ASP.NET MVC Model元数据(二)
    ASP.NET MVC Model元数据(一)
    腾讯云服务器linux centOS7.4 搭建ftp服务器 vsftpd
    腾讯云服务器linux Ubuntu操作系统搭建ftp服务器vsftpd
    linux设置禁止ping
    linux 查询管道过滤,带上标题字段
    安装php xdebug调试工具及性能分析工具webgrind for windows
    linux增加硬盘 磁盘分区格式化及挂载
    virtualBox linux操作系统centos 挂载光盘
  • 原文地址:https://www.cnblogs.com/liankewei/p/16059334.html
Copyright © 2020-2023  润新知