• C++ 泛型编程-模板


    一、C++模板相关

    c++提供两种模板机制:函数模板和类模板

    • 模板把函数或类要处理的数据类型参数化,表现为参数的多态性
    • 模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为。
    • 用模板是为了实现泛型,可以减轻编程的工作量,增强函数的重用性。

    1. 函数模板

    函数模板与普通函数区别:
     函数模板不允许自动类型转化
     普通函数能够自动进行类型转化

    调用规则:
     c++编译器优先考虑普通函数
     可以通过空模板实参列表的语法限定编译器只能通过模板匹配
     函数模板可以像普通函数那样可以被重载
     如果函数模板可以产生一个更好的匹配,那么选择模板

    函数模板实现机制:
     编译器并不是把函数模板处理成能够处理任何类型的函数
     函数模板通过具体类型产生不同的函数
     编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编译。

    具体化函数模板:
    第三代具体化,显示具体化的原型和定意思以template<>开头,并通过名称来指出类型
    具体化优先于常规模板
    template<>void mySwap(Person &p1, Person &p2){}

    2. 类模板

    类模板和函数模板的定义和使用类似,我们已经进行了介绍。有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同。

    • 类模板用于实现类所需数据的类型参数化
    • 类模板不能进行类型自动推导 ,函数模板可以自动类型类型推导(不能自动类型转化)
    • 类模板可以做函数参数
    • 类模板派生普通类
      //子类实例化的时候需要具体化的父类,子类需要知道父类的具体类型是什么样的
      //这样c++编译器才能知道给子类分配多少内存
    • 类模板派生类模板
      /继承类模板的时候,必须要确定基类的大小
    • 类模板类内实现
    • 类模板类外实现
    • 模板分文件编译
      解决方案: 类模板的声明和实现放到一个文件中,我们把这个文件命名为.hpp(这个是个约定的规则,并不是标准,必须这么写).
      原因:
       类模板需要二次编译,在出现模板的地方编译一次,在调用模板的地方再次编译。
       C++编译规则为独立编译。

    3. C++模板分文件编译问题

    头文件源文件 分文件编译出错的原因分析
    在这里插入图片描述

    4. C++模板全特化和偏特化 泛型编程

    全特化(特例化) 部分特例化(偏特化)
    模板特例化原因: 对特定类型特定知识,提高效率
    全特化条件:1 必须有一个主模板,2 然后模板类型全部实例化
    函数模板只有全特化, 偏特化可以通过函数重载完成
    类模板既有全特化 也有偏特化
    调用顺序:全特化类 > 偏特化类 > 主模板类

    二、C++11特性

    • 类型推导 auto、decltype和decltype(auto)的用法

      1.auto
      //普通;类型 正常
      //const类型
      //引用和指针类型
      2. decltype
      3. delctype(auto) c++14

    • nullptr和NULL的区别

    • 右值引用

    • 范围for循环

    • lambada表达式

    • 列表初始化:{}内 精度降低会编译报错

    • 并发

    • 【智能指针】

  • 相关阅读:
    Streamlit学习笔记
    《016.SpringBoot+vue校园社团管理系统》【有文档】
    【编程之路】Python编程进阶
    基于Promise + XHR 封装myAxios函数
    21款奔驰GLS450升级23P驾驶辅助 提升安全出行
    nvm常用命令有哪些?nvm如何切换node版本?nvm如何下载node?nvm安装包
    什么是js中的作用域
    input的一些输入限制
    linux/kali2023.1工具集合()
    如何长期有效维护客户关系,你真的了解你的客户吗?
  • 原文地址:https://blog.csdn.net/rayso9898/article/details/126134592