当前位置: 首页 > article >正文

C++ 模板初阶总结

1. 泛型编程

  • 目标:编写与类型无关的通用代码,提高代码复用性。
  • 问题:传统函数重载需为每种类型编写重复代码,维护成本高。
  • 解决方案:使用模板(Template),通过编译器自动生成特定类型的代码。

2. 函数模板


定义:

template<typename T>
void Swap(T& left, T& right) {
    T temp = left;
    left = right;
    right = temp;
}
  • typename 或 class 声明模板类型参数。

原理:

  • 编译器根据实参类型生成具体函数(如 Swap<int>、Swap<double>)。
  • 模板是代码生成的 “模具”,避免手动编写重复代码。

实例化:

  • 隐式实例化:编译器自动推导类型。
    • Swap(1, 2);  // T 推导为 int
      
    • 显式实例化:手动指定类型。
      Swap<double>(3.14, 2.71);  // 显式指定 T 为 double
      Swap(3, (doouble)2.71);  //强转 double
      
      
    • 匹配原则
      • 非模板函数与模板函数可共存,优先调用非模板函数。
      • 模板函数不支持自动类型转换,普通函数支持。

3. 类模板
  • 定义
    template<typename T>
    class Stack {
    public:
        Stack(size_t capacity = 4);
        void Push(const T& data);
    private:
        T* _array;
        size_t _capacity, _size;
    };
    
  • 实例化
    Stack<int> st1;   // 实例化为 int 类型的栈
    Stack<double> st2; // 实例化为 double 类型的栈
    
  • 注意事项
    • 类模板的声明和定义需放在同一文件中,否则可能导致链接错误。
    • 成员函数在类外定义时需保留模板参数:
      template<typename T>
      void Stack<T>::Push(const T& data) {
          _array[_size++] = data;
      }
      

4. 关键特性
  • 类型安全:模板在编译期检查类型,避免运行时错误。
  • 灵活性:支持动态指定类型,适应多种场景。
  • 代码复用:一套模板代码适配所有类型,减少冗余。

5. 常见问题
  • 类型推导冲突:当实参类型不一致时,需显式实例化或强制类型转换。
    Add(1, 2.0);  // 错误,类型不匹配
    Add<double>(1, 2.0);  // 正确,显式指定类型
    
  • 分离编译问题:类模板的声明和定义不能分离到 .h 和 .cpp 文件,否则链接失败。

6. 应用场景
  • 容器类(如栈、队列)。
  • 通用算法(如排序、查找)。
  • 元编程(编译期计算,如 Factorial 模板)。

通过模板,C++ 实现了泛型编程,显著提升了代码的可维护性和复用性。


http://www.kler.cn/a/584596.html

相关文章:

  • QT系列教程(16) 定时器事件
  • 为什么 Young GC 比 Full GC 快
  • 科技创新:改变生活的力量与未来趋势
  • nginx学习,URI,try_files
  • AWS Bedrock全托管接入国产大模型DeepSeek-R1[内涵免费使用DeepSeek-R1满血版]
  • 微博发布Q4及全年财报:微博成汽车手机新品营销主阵地
  • 【后端】【django】导出 API 文档的几种方法
  • 网络安全相关资源安全合规检查与整改计划‌
  • 【开源+代码解读】Search-R1:基于强化学习的检索增强大语言模型框架3小时即可打造个人AI-search
  • vue2双向绑定解析
  • 【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JavaWeb 中的文件上传与下载:实现文件管理功能
  • STM32 HAL库实战:轻松实现串口通信驱动蓝牙模块与ESP8266开发
  • 数据中心安全建设方案,数据安全运营体系建设方案,信息中心安全解决方案(PPT)
  • 深度学习基础--CNN经典网络之“DenseNet”简介,源码研究与复现(pytorch)
  • RabbitMQ五种消息模型
  • 零成本搭建Calibre个人数字图书馆支持EPUB MOBI格式远程直读
  • 鸿蒙开发-一多开发之媒体查询功能
  • XSS跨站脚本攻击
  • Bash和Zsh的主要差异是?
  • 新鲜速递:OpenAI-Agents-Python:构建智能代理系统的轻量级框架