引言
C++ 模板是泛型编程的基础,它允许我们编写与类型无关的通用代码。通过模板,我们可以实现代码复用,提高开发效率。本文将介绍模板参数的使用及注意事项、模板类与类模板的区别,并通过示例帮助您快速掌握 C++ 模板的基本用法。
1. 模板参数以及注意事项和调用方式
1.1 模板参数
模板参数是模板定义中的占位符,用于在编译时替换为具体的类型或值。模板参数分为两种:
- 类型参数:用
typename
或class
关键字声明。 - 非类型参数:可以是整数、指针或引用等。
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 调用方式
显式调用:
- 手动指定模板参数。
示例:
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++ 泛型编程的关键。