乐于分享
好东西不私藏

每日C++:模板基础-函数模板+类模板

每日C++:模板基础-函数模板+类模板

每日C++:模板基础-函数模板+类模板

一、什么是模板

核心一句话

模板:把类型当作“参数”,写一份通用代码,支持 int、double、string、自定义类 任意类型复用,不用重复写多份重载函数/类。

模板分为两大类:

  1. 函数模板:通用函数,适配任意类型
  2. 类模板:通用类,适配任意类型(比如 vector 就是类模板)

作用

  • 代码复用,不用为每种类型写重复代码
  • 编译期实例化,没有运行时开销
  • 类型安全,不像 C 语言 void* 强制转换容易出错

二、模板语法基础

关键字:

template <typename T>// 或template <class T>
  • template<> 声明模板
  • T 是类型参数,代表任意未知类型
  • typename 和 class 在这里完全等价

三、函数模板

1. 基础语法格式

template<typename T>返回值 函数名(参数列表){// 内部用 T 当做类型使用}

2. 示例:写一个通用交换函数

普通写法要写 swapIntswapDoubleswapString,重复代码多。 用函数模板只写一份:

#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. 函数模板调用两种方式

  1. 自动类型推导mySwap(a,b); 编译器自己判断 T
  2. 手动指定类型mySwap<int>(a,b);

4. 函数模板注意点

  1. 模板不能把实现放cpp文件,一般都写在头文件
  2. 模板只有被调用时才会编译实例化,不用不会生成代码
  3. 两个参数必须是同类型,否则推导失败

四、类模板

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;    }// 出栈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. 类模板使用特点

  1. 类模板无法自动类型推导,必须显式指定:MyStack<int>
  2. 每一个不同类型,编译后会生成一份独立类代码
  3. STL 里 vector<T>list<T>queue<T> 全是类模板

五、多模板参数

可以声明多个类型参数:

template<typename T1, typename T2>void printTwo(T1 a, T2 b){    cout << a << " , " << b << endl;}// 调用printTwo(1003.14);printTwo("hello"666);

六、模板基础核心总结

1. 函数模板

  • 作用:通用函数,一份代码适配多类型
  • 调用:可自动推导类型
  • 场景:通用工具函数、比较、交换、求和等

2. 类模板

  • 作用:通用类容器/工具类,适配任意数据类型
  • 调用:必须手动指定 <类型>
  • 场景:自定义容器、数据结构、STL 底层

3. 口诀

模板尖括号,类型当参数;

函数可推导,类模要写明;

一份通用码,多类型复用;

编译实例化,高效又安全。

The End・💛

点点在看,万事美满,随手点赞,岁岁平安~💛