前言
就像做菜一样——模板是“菜谱”,具体类型是“食材” 😄
提示:以下是本篇文章正文内容,下面案例可供参考
一、函数模板:万能调料瓶
场景:你想做一个能装任何调料(类型)的调料瓶,比如盐、糖、辣椒...
传统方法:为每种调料单独做瓶子(重复代码)
// 装盐的函数
void addSalt(int amount) { ... }
// 装糖的函数
void addSugar(double amount) { ... }
函数模板:一个通用模板,自动适应调料类型
template<typename T> // 声明模板,T是占位符类型
void addSeasoning(T amount) {
cout << "加入" << amount << "克调料" << endl;
}
使用:
addSeasoning<int>(5); // 加入5克盐(自动生成int版本)
addSeasoning(3.14); // 自动推导为double类型
二、类模板:多功能收纳盒
场景:想做一个能装任何物品(类型)的盒子,比如书本、玩具...
传统方法:为每种物品单独做盒子(冗余代码)
class BookBox {
public:
BookBox(Book b) { ... }
};
class ToyBox {
public:
ToyBox(Toy t) { ... }
};
类模板:一个通用盒子模板
template<class ItemType> // 同样用typename也行,习惯问题
class MagicBox {
private:
ItemType content;
public:
MagicBox(ItemType thing) : content(thing) {}
void show() {
cout << "盒子里有:" << content << endl;
}
};
使用:
MagicBox<string> bookBox("哈利波特"); // 必须显式指定类型<string>
bookBox.show(); // 输出:盒子里有:哈利波特
MagicBox<int> numBox(42);
numBox.show(); // 输出:盒子里有:42
三、模板的核心思想
- 避免重复:像复印机一样,写一次模板,编译器帮你生成各种具体版本
- 类型安全:比
void*
指针更安全,编译器会检查类型是否正确 - 延迟确定类型:用的时候才决定具体类型,灵活性高
四、生活对比
●函数模板 ≈ 万能开瓶器(能开任何形状的瓶盖)
●类模板 ≈ 乐高积木模具(能造出各种形状的积木)