C++ 模板初阶

什么是模板?

模板(Template)是 C++ 中实现泛型编程的核心工具。它允许我们编写与具体数据类型无关的代码,从而实现代码复用和类型安全。

为什么需要模板?

举个生活中的例子:

如果你要造一个能装水的杯子,你会设计一个通用的模具(模板),而不是为每一种液体(水、果汁、牛奶)都造一个杯子。

C++ 模板就是这个"模具"------它能根据不同的类型生成不同的"杯子"(函数或类)。

一、函数模板(Function Template)

cpp 复制代码
template <typename T>
返回类型 函数名(参数列表) {
    // 函数体
}

template:声明这是一个模板。

typename T:定义一个模板参数(T 可以是任意类型)。(class也可以)

cpp 复制代码
#include <iostream>
using namespace std;

// 函数模板:加法
template <typename T>
T Add(T a, T b) {
    return a + b;
}

int main() {
    cout << Add(3, 5) << endl;        // int 类型
    cout << Add(3.14, 2.5) << endl;   // double 类型
    cout << Add('A', 'B') << endl;    // char 类型
    return 0;
}

Add 函数能处理 int、double、char 等类型。

优点:避免为每种类型写重复函数!

注意事项

模板参数推导:

编译器会自动根据传入参数推导类型 T。

例如:Add(3, 5) 推导出 T = int。

显式指定类型:

cpp 复制代码
Add<int>(3, 5);  // 显式指定 T = int

二、类模板(Class Template)

cpp 复制代码
template <typename T>
class 类名 {
    // 类成员
};
cpp 复制代码
#include <iostream>
using namespace std;

// 类模板:栈
template <typename T>
class Stack {
private:
    T data[100];
    int top;
public:
    Stack() : top(0) {}
    void push(T value) {
        data[top++] = value;
    }
    T pop() {
        return data[--top];
    }
};

int main() {
    Stack<int> intStack;     // int 类型栈
    Stack<char> charStack;   // char 类型栈

    intStack.push(10);
    intStack.push(20);
    cout << intStack.pop() << endl;  // 输出 20

    charStack.push('A');
    cout << charStack.pop() << endl; // 输出 A

    return 0;
}

解释:

Stack<int> 和 Stack<char> 是两个不同类型的类。

优点:通过模板,用一份代码生成多个类型版本。

注意事项

模板类与普通类的区别:

模板类本身不是类,而是类的生成规则。

实例化后(如 Stack<int>)才是真正的类。

模板参数不止是类型:

可以是常量值(如 int N),例如:

cpp 复制代码
template <int N>
class Array {
    T data[N];
};

三、模板的限制与常见错误

示例 1:类型不匹配

cpp 复制代码
Add("Hello", 123);  // 编译错误!字符串和整数不能推导出统一的 T

示例 2:忘记包含头文件

cpp 复制代码
// 忘记 #include <string>
string str;  // 错误!

模板的进阶学习建议

模板特化:为特定类型定制行为。

模板元编程:利用模板实现编译期计算。

STL 源码:学习标准库中模板的高级用法(如 vector<T>、map<K, V>)。

小练习

试着用模板实现一个通用的最大值比较函数:

cpp 复制代码
template <typename T>
T Max(T a, T b) {
    return (a > b) ? a : b;
}

看看它能否支持 int、double、string!

希望这篇博客能帮你快速入门 C++ 模板!

相关推荐
奇某人13 分钟前
【语法】【C+V】本身常用图表类型用法快查【CSDN不支持,VSCODE可用】
开发语言·vscode·markdown·mermaid
做一位快乐的码农29 分钟前
php程序设计之基于PHP的手工艺品销售网站/基于php在线销售系统/基于php在线购物商城系统
开发语言·php
@珍惜一生@1 小时前
Qt开源库
开发语言·qt·开源
Slaughter信仰1 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第四章知识点问答补充及重新排版
java·开发语言·jvm
心灵宝贝1 小时前
Mac用户安装JDK 22完整流程(Intel版dmg文件安装指南附安装包下载)
java·开发语言·macos
secondyoung2 小时前
一文丝滑使用Markdown:从写作、绘图到转换为Word与PPT
开发语言·vscode·编辑器·powerpoint·markdown·visual studio·mermaid
Incredibuild2 小时前
DevSecOps 集成 CI/CD Pipeline:实用指南
c++·ci/cd·devsecops
雨枪幻。3 小时前
spring boot开发:一些基础知识
开发语言·前端·javascript
爱炸薯条的小朋友3 小时前
C#由Dictionary不正确释放造成的内存泄漏问题与GC代系
开发语言·opencv·c#
m0_480502645 小时前
Rust 登堂 之 函数式编程(三)
开发语言·后端·rust