跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 模板编程详解:从函数模板到类模板

C++ 模板编程的基础知识,包括函数模板和类模板的语法、隐式实例化机制及类型推演规则。文章通过 Swap 函数和自定义 Bag 类的示例,说明了模板如何消除重复代码并实现泛型复用。同时补充了编译期计算(如斐波那契)和 vector<bool> 特化陷阱等冷知识,强调了模板在编译期生成代码的特性及其对类型一致性的严格要求。

GitMaster发布于 2026/3/22更新于 2026/8/2414K 浏览
C++ 模板编程详解:从函数模板到类模板

概述

模板是 C++ 中实现参数化多态的编译期机制,通过类型参数抽象数据结构与算法,使同一份源码可被实例化为多个特化版本,从而达成零运行时开销的泛型复用。

为什么需要模板?

场景还原:重复代码问题

例如编写 Swap 函数:

void Swap(int& left, int& right) {
    int temp = left;
    left = right;
    right = temp;
}

每新增一个类型,就需要复制一份代码。这不仅耗时间,还容易引入逻辑错误(如漏写赋值语句)。必须使用泛型来破障。

函数模板

语法结构

template<typename T>
void Swap(T& left, T& right) {
    T temp = left;
    left = right;
    right = temp;
}

注意:typename 和 class 在此处等价。

隐式实例化

int totalCount = 42;
int anotherCount = 100;
Swap(totalCount, anotherCount); // 编译器生成 int 版 Swap
double memoryBlock = 3.14;
double dataChunk = 2.71;
Swap(memoryBlock, dataChunk); // 编译器生成 double 版 Swap

模板不占用栈或堆内存,它在编译期生成目标代码。

类型推演规则

int totalCount = 10;
double memoryBlock = 3.14;
// Swap(totalCount, memoryBlock); // 报错:T 无法推导为 int 或 double

模板拒绝隐式转换导致的歧义。

类模板

批量锻造法宝

传统做法需为每种物品建一个类。模板解法如下:

template<typename ItemType>
class Bag {
private:
    ItemType* dataChunk;
    size_t capacity;
    size_t itemCount;
public:
    Bag(size_t cap = 10) : capacity(cap), itemCount(0) {
        dataChunk = new ItemType[capacity];
    }
    void addItem(const ItemType& item) {
        if (itemCount < capacity) {
            dataChunk[itemCount++] = item;
        }
    }
    ItemType& getItem(size_t index) {
        return dataChunk[index];
    }
};

使用示例:

Bag<int> treasureBag(100);
Bag<std::string> talismanBag(50);

补充知识

编译期计算

模板支持编译期递归计算,如斐波那契数列:

template<int N> struct Fib {
    static constexpr int value = Fib<N-1>::value + Fib<N-2>::value;
};

vector 陷阱

vector<bool> 是空间优化特化版(位压缩),operator[] 返回代理对象而非引用,使用时需注意。

核心要点

  • 模板是蓝图,编译器按需生成具体版本;
  • typename T 是占位符,直到传入实参才确定类型;
  • 类型推演拒绝妥协,宁可报错也不强转;
  • 类模板用于批量定义通用数据结构。

目录

  1. 概述
  2. 为什么需要模板?
  3. 场景还原:重复代码问题
  4. 函数模板
  5. 语法结构
  6. 隐式实例化
  7. 类型推演规则
  8. 类模板
  9. 批量锻造法宝
  10. 补充知识
  11. 编译期计算
  12. vector<bool> 陷阱
  13. 核心要点
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 拆解 Llama 4 Scout:Meta 新一代 MoE 模型核心优势
  • Linux (Kali) 部署 OpenClaw 指南
  • ormpp:现代 C++ ORM 库的数据库操作指南
  • 35 道常见前端 Vue 面试题详解
  • VSCode 本地运行 DeepSeek 模型配置教程
  • Python 家庭用电数据分析与 Prophet 时间序列预测
  • Python 使用 Turtle 库绘制圣诞树
  • GPT 大模型构建原理与 NLP 技术演进解析
  • 格拉姆角场(GAF)时间序列可视化与特征编码详解
  • 多模态 AI 知识库构建指南
  • Git 国内镜像源下载与安装配置指南
  • Qwen3 与 Qwen Agent 智能体开发实战:接入 MCP 工具
  • Kali Linux 2025.4 在 VMware 中鼠标不显示的解决方法
  • 位图矢量化技术瓶颈突破:Potrace 算法深度解析与应用实践
  • 机器人灵巧操作新突破:学习系鞋带与挂衣服
  • AI Agent 沙箱选型指南:五种隔离架构对比
  • 企业微信可信 IP 配置:无备案域名的 Python 实现
  • Cursor 的代理配置:填一次就生效
  • 前端面试复盘:从基础原理到工程化的核心考察点
  • Resilience4j 熔断降级深度解析:状态机、Fallback 与限流算法

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online