[C++高频精进] 模板与STL:模板

部署运行你感兴趣的模型镜像

核心要点速览

  • 意义:将类型作为参数,实现通用逻辑,编译期生成具体类型代码
  • 分类:函数模板(可隐式实例化)、类模板(需显式实例化)
  • 模板参数:类型参数(typename T)、非类型参数(编译期常量)
  • 特化:全特化(所有参数指定类型)、偏特化(仅类模板支持,部分参数指定类型)
  • 区别:模板有类型检查,宏无;模板支持特化 / 重载,宏不支持

一、模板的意义

通过 “类型参数化” 让通用逻辑适配多种类型,既避免为不同类型重复编写相似代码(提升复用),又能在编译期进行类型检查(保证安全),且编译器会生成具体类型的代码(无运行时开销)。这也是 STL 容器(如 vector)和算法(如 sort)的实现基础。


二、函数模板

定义

生成具体函数的 “模板”,编译器根据实参类型自动实例化对应版本。

规则

  • 语法:template<模板参数列表> 返回类型 函数名(参数列表) { ... }
  • 实例化:
    • 隐式实例化:编译器根据实参推导类型(如max(1,2)推导T=int)。
    • 显式实例化:手动指定类型(如max<int>(1.5,2.5)强制T=int)。
  • 重载:支持模板间重载(参数列表 / 模板参数不同),非模板函数优先级高于模板函数。

函数模板VS模板函数

  • 函数模板是带template的 “通用模板”(比如template<typename T> T add(T a, T b)),是生成具体函数的 “模具”,本身不能直接调用。
  • 模板函数是从函数模板实例化出的 “具体函数”(比如int add(int a, int b)),是能实际调用的实体。
  • 示例说明
// 1. 函数模板(模板/蓝图)
template<typename T>  // 包含类型参数T,通用定义
T add(T a, T b) {
    return a + b;
}

int main() {
    // 调用时,编译器根据实参类型实例化出模板函数
    int sum1 = add(1, 2);  // 触发实例化:int add(int a, int b)(模板函数1)
    double sum2 = add(1.5, 2.5);  // 触发实例化:double add(double a, double b)(模板函数2)
    return 0;
}

三、类模板

定义

生成具体类的 “模板”,用于创建与类型相关的通用类(如vectormap)。

规则

  • 语法:template<模板参数列表> class 类名 { ... };
  • 实例化:必须显式指定模板参数(编译器无法推导),格式类名<类型>(如Vector<int>)。
  • 成员函数:类外定义时需保留模板参数(如template<typename T> void Vector<T>::push_back(T val) { ... })。

四、模板参数:类型参数与非类型参数

1. 类型参数

  • 声明:typenameclass修饰(两者等价),代表任意类型(如intstring、自定义类)。
  • 用途:最常用,适配不同数据类型。

2. 非类型参数

  • 定义:代表编译期常量(值在编译期可确定)。
  • 支持类型:整数类型(intsize_t)、全局变量 / 函数的指针 / 引用。
  • 限制:不支持浮点数、类对象(编译期无法确定值)。
// 非类型参数示例:固定大小数组
template<typename T, int N> // N为编译期常量
class FixedArray {
    T arr[N]; // 大小由N确定
public:
    int size() { return N; }
};

五、模板特化:定制特定类型实现

为特定类型提供定制化实现,覆盖泛化版本(解决泛化模板对某些类型不适用的问题)。

1. 全特化

  • 定义:为模板所有参数指定具体类型,完全覆盖泛化版本。
template<typename T> class Printer { /* 泛化逻辑 */ };
template<> class Printer<int> { /* int类型专属逻辑 */ }; // 全特化

2. 偏特化(仅类模板支持)

  • 定义:为模板部分参数指定具体类型,函数模板不支持偏特化。
template<typename T> class Handler { /* 泛化逻辑 */ };
template<typename T> class Handler<T*> { /* 指针类型专属逻辑 */ }; // 偏特化

六、补充

1. 惰性实例化

模板仅实例化被使用的成员,未使用的成员不会生成代码(减少冗余)。

2. 分离编译问题

模板定义与声明不能分离到.h.cpp(需放在同一文件,或显式实例化特定类型)。

3. 模板与宏的区别

对比维度模板(Template)宏(#define
类型检查编译期强类型检查(安全)无类型检查(文本替换,易错)
调试支持支持(可见具体实例化类型)不支持(替换后无宏信息)
灵活性支持复杂逻辑、重载、特化仅简单文本替换(复杂逻辑易出错)
代码生成编译期生成具体类型代码预编译期替换,不生成新代码

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值