每日C++:模板基础-函数模板+类模板
一、什么是模板
核心一句话
模板:把类型当作“参数”,写一份通用代码,支持 int、double、string、自定义类 任意类型复用,不用重复写多份重载函数/类。
模板分为两大类:
函数模板:通用函数,适配任意类型 类模板:通用类,适配任意类型(比如 vector 就是类模板)
作用
代码复用,不用为每种类型写重复代码 编译期实例化,没有运行时开销 类型安全,不像 C 语言 void* 强制转换容易出错
二、模板语法基础
关键字:
template <typename T>// 或template <class T>template<>声明模板T是类型参数,代表任意未知类型typename和class在这里完全等价
三、函数模板
1. 基础语法格式
template<typename T>返回值 函数名(参数列表){// 内部用 T 当做类型使用}2. 示例:写一个通用交换函数
普通写法要写 swapInt、swapDouble、swapString,重复代码多。 用函数模板只写一份:
#include <iostream>#include <string>using namespace std;// 函数模板template<typename T>void mySwap(T &a, T &b){ T temp = a; a = b; b = temp;}int main(){int a = 10, b = 20;mySwap(a, b); // 自动推导 T = int cout << a << " " << b << endl;double x = 1.1, y = 2.2;mySwap(x, y); // 自动推导 T = double cout << x << " " << y << endl; string s1 = "abc", s2 = "def";mySwap(s1, s2); // 自动推导 T = string cout << s1 << " " << s2 << endl;return 0;}3. 函数模板调用两种方式
自动类型推导: mySwap(a,b);编译器自己判断 T手动指定类型: mySwap<int>(a,b);
4. 函数模板注意点
模板不能把实现放cpp文件,一般都写在头文件 模板只有被调用时才会编译实例化,不用不会生成代码 两个参数必须是同类型,否则推导失败
四、类模板
1. 基础语法格式
template<typename T>class 类名{public: T 成员变量;void func(T val);};2. 示例:写一个通用栈容器
#include <iostream>using namespace std;// 类模板template<typename T>class MyStack{private: T data[100];int topIdx;public:MyStack() : topIdx(0) {}// 入栈void push(T val){ data[topIdx++] = val; }// 出栈T pop(){return data[--topIdx]; }};int main(){// 必须手动指定类型,不能自动推导 MyStack<int> intStack; intStack.push(100); cout << intStack.pop() << endl; MyStack<double> doubleStack; doubleStack.push(3.14); cout << doubleStack.pop() << endl;return 0;}3. 类模板外部成员函数实现写法
如果成员函数写在类外面,必须再加 template<typename T>
template<typename T>class MyStack{public:void push(T val);};// 外部实现,必须重写模板声明template<typename T>void MyStack<T>::push(T val){// ...}4. 类模板使用特点
类模板无法自动类型推导,必须显式指定: MyStack<int>每一个不同类型,编译后会生成一份独立类代码 STL 里 vector<T>、list<T>、queue<T>全是类模板
五、多模板参数
可以声明多个类型参数:
template<typename T1, typename T2>void printTwo(T1 a, T2 b){ cout << a << " , " << b << endl;}// 调用printTwo(100, 3.14);printTwo("hello", 666);六、模板基础核心总结
1. 函数模板
作用:通用函数,一份代码适配多类型 调用:可自动推导类型 场景:通用工具函数、比较、交换、求和等
2. 类模板
作用:通用类容器/工具类,适配任意数据类型 调用:必须手动指定 <类型>场景:自定义容器、数据结构、STL 底层
3. 口诀
模板尖括号,类型当参数;
函数可推导,类模要写明;
一份通用码,多类型复用;
编译实例化,高效又安全。
The End・💛
点点在看,万事美满,随手点赞,岁岁平安~💛
夜雨聆风