C++ 模板初阶:从模板参数到模板类与类模板

发布于:2025-03-03 ⋅ 阅读:(18) ⋅ 点赞:(0)

引言

C++ 模板是泛型编程的基础,它允许我们编写与类型无关的通用代码。通过模板,我们可以实现代码复用,提高开发效率。本文将介绍模板参数的使用及注意事项、模板类与类模板的区别,并通过示例帮助您快速掌握 C++ 模板的基本用法。

1. 模板参数以及注意事项和调用方式

1.1 模板参数

模板参数是模板定义中的占位符,用于在编译时替换为具体的类型或值。模板参数分为两种:

  1. 类型参数:用 typename 或 class 关键字声明。
  2. 非类型参数:可以是整数、指针或引用等。
1.1.1 类型参数

示例

template <typename T>
T add(T a, T b) {
    return a + b;
}
1.1.2 非类型参数

示例

template <int N>
void printSize() {
    std::cout << "Size: " << N << std::endl;
}
  • N 是一个非类型参数,必须是编译时常量。
  • 1.2 注意事项

  • 模板参数的作用域

    • 模板参数的作用域仅限于模板定义内部。

示例:

template <typename T>
void func() {
    T value; // T 是模板参数
}

模板参数的默认值

  • 可以为模板参数指定默认值。

示例:

template <typename T = int>
class MyClass {
    // T 默认为 int
};

模板参数的推导

  • 编译器可以根据函数参数自动推导模板参数。

示例:

template <typename T>
void print(T value) {
    std::cout << value << std::endl;
}
print(10); // T 被推导为 int

1.3 调用方式

  1. 显式调用

    • 手动指定模板参数。

示例:

int result = add<int>(10, 20); // 显式指定 T 为 int

隐式调用

  • 编译器根据参数自动推导模板参数。

示例:

int result = add(10, 20); // 编译器推导 T 为 int

2. 模板类与类模板的区别

2.1 模板类

  • 定义

    • 模板类是通过模板参数生成的具体的类。

示例:

template <typename T>
class MyClass {
public:
    T value;
    MyClass(T v) : value(v) {}
};

// 使用模板类
MyClass<int> obj(10); // 模板类 MyClass<int>
  • 特点

    • 模板类是一个具体的类,模板参数已经被替换为实际类型。

2.2 类模板

  • 定义

    • 类模板是模板的定义,它本身不是一个具体的类,而是一个生成类的蓝图。

示例:

2.2 类模板
定义:

类模板是模板的定义,它本身不是一个具体的类,而是一个生成类的蓝图。

2.3 区别总结

特性 模板类 类模板
定义 通过模板参数生成的具体的类 模板的定义,生成类的蓝图
实例化 已经实例化为具体的类 需要通过模板参数实例化为具体类
使用方式 直接使用 需要指定模板参数

2.4 示例对比

// 类模板
template <typename T>
class Box {
public:
    T content;
    Box(T c) : content(c) {}
};

// 模板类
Box<int> intBox(10); // Box<int> 是一个模板类
Box<double> doubleBox(3.14); // Box<double> 是另一个模板类

总结

  • 模板参数分为类型参数和非类型参数,使用时需要注意作用域、默认值和推导规则。
  • 模板类是通过模板参数生成的具体的类,而类模板是生成类的蓝图。
  • 掌握模板的基本用法是理解 C++ 泛型编程的关键。