C++——模版(函数模版和类模版)

C++ 模板(Templates)完整介绍

模板是 C++ 中一种强大的泛型编程机制,允许开发者编写与类型无关的代码,从而提高代码的复用性和灵活性。

通过模板,可以避免为不同数据类型重复编写相似的函数或类,实现真正的代码复用。

1. 模板的基本概念

1.1 为什么需要模板?

  • 避免代码重复 :传统函数或类需要为不同数据类型(如 intdoublestring)重复实现相同逻辑。
  • 类型安全:模板在编译时生成特定类型的代码,避免运行时类型错误。
  • 提高效率:减少类型转换和重复代码,提升性能。

1.2 模板的两种形式

  • 函数模板:适用于函数,可以处理多种数据类型。
  • 类模板:适用于类,可以定义通用的类结构。

2. 函数模板

2.1 基本语法

cpp 复制代码
template <typename T>  // 或 template <class T>
T max(T a, T b) {
    return (a > b) ? a : b;
}
  • template <typename T> :声明一个模板,T 是类型参数(可以是 intdoublestring 等)。
  • T max(T a, T b) :定义一个泛型函数,参数和返回值类型均为 T

2.2 使用示例

cpp 复制代码
int main() {
    int a = 5, b = 10;
    double x = 3.14, y = 2.71;

    cout << max(a, b) << endl;    // 输出:10(自动推导 T=int)
    cout << max(x, y) << endl;    // 输出:3.14(自动推导 T=double)
}
  • 自动类型推导 :编译器根据参数类型自动推导 T 的具体类型。
  • 显式指定类型
cpp 复制代码
cout << max<int>(3.14, 2.71);  // 强制 T=int,结果截断为 3

2.3 多个类型参数

cpp 复制代码
template <typename T, typename U>
T min(T a, U b) {
    return (a < b) ? a : b;
}
  • 用途 :适用于参数类型不同的情况(如 intdouble 比较)。

3. 类模板

3.1 基本语法

cpp 复制代码
template <typename T>
class Stack {
private:
    vector<T> data;
public:
    void push(T value) {
        data.push_back(value);
    }
    T pop() {
        T value = data.back();
        data.pop_back();
        return value;
    }
};
  • template <typename T> :声明一个类模板,T 是类型参数。
  • vector<T> :使用泛型类型 T 定义成员变量。

3.2 使用示例

cpp 复制代码
int main() {
    Stack<int> intStack;    // 实例化一个存储 int 的 Stack
    Stack<string> strStack; // 实例化一个存储 string 的 Stack

    intStack.push(42);
    strStack.push("Hello");

    cout << intStack.pop() << endl;  // 输出:42
    cout << strStack.pop() << endl;  // 输出:"Hello"
}
  • 显式指定类型 :必须明确指定 T 的具体类型(如 Stack<int>)。

3.3 模板特化(Template Specialization)

  • 作用:为特定类型提供定制化的实现。
  • 示例
cpp 复制代码
template <>
class Stack<bool> {  // 针对 bool 类型的特化版本
private:
    vector<int> data;  // 用 int 存储 bool(节省空间)
public:
    void push(bool value) {
        data.push_back(value ? 1 : 0);
    }
    bool pop() {
        int value = data.back();
        data.pop_back();
        return value != 0;
    }
};
  • 用途 :优化特定类型的性能或行为(如 bool 类型)。

4. 模板的编译与实例化

4.1 编译过程

  1. 模板定义:编译器看到模板代码,但不立即生成代码。
  2. 实例化 :当使用模板时(如 max(3, 5)Stack<int>),编译器根据具体类型生成对应的代码。
  3. 类型检查 :编译器检查类型是否合法(如 max("a", "b") 会报错,因为 string 没有 > 运算符)。

4.2 显式实例化

cpp 复制代码
template class Stack<double>;  // 强制编译器生成 Stack<double> 的代码
  • 用途:减少编译时间,或确保某些类型被编译。

5. 模板的优缺点

5.1 优点

  • 代码复用:一套代码处理多种数据类型。
  • 类型安全:编译时检查类型,避免运行时错误。
  • 性能优化:无类型转换开销,接近手写代码的效率。

5.2 缺点

  • 编译时间增加:模板代码在每次使用时都会实例化,可能导致编译变慢。
  • 错误信息复杂:模板错误通常难以阅读(尤其是多层嵌套时)。
  • 不支持运行时多态:模板是编译时多态,无法像虚函数那样在运行时动态绑定。
相关推荐
catchadmin14 小时前
PHP True Async RFC 被拒——原生异步离 PHP 还有多远?
开发语言·php
J***793914 小时前
PHP在电商中的Magento
开发语言·php
恒者走天下14 小时前
秋招落定,拿到满意的offer,怎么提高自己实际的开发能力,更好的融入团队
c++
python零基础入门小白15 小时前
【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通)
java·开发语言·设计模式·语言模型·架构·大模型应用开发·大模型学习
天若有情67315 小时前
【c++】手撸C++ Promise:从零实现通用异步回调组件,支持链式调用+异常安全
开发语言·前端·javascript·c++·promise
无心水15 小时前
【Python实战进阶】1、Python高手养成指南:四阶段突破法从入门到架构师
开发语言·python·django·matplotlib·gil·python实战进阶·python工程化实战进阶
学困昇15 小时前
C++中的异常
android·java·c++
q***318315 小时前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
合作小小程序员小小店15 小时前
桌面安全开发,桌面二进制%恶意行为拦截查杀%系统安全开发3.0,基于c/c++语言,mfc,win32,ring3,dll,hook,inject,无数据库
c语言·开发语言·c++·安全·系统安全
合作小小程序员小小店15 小时前
桌面开发,超市管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·sqlserver·c#