1. C++模板参数深度解析
模板是C++泛型编程的核心机制,它允许我们编写与类型无关的代码。理解模板参数是掌握模板编程的第一步,也是进阶C++开发的必备技能。
1.1 类型参数详解
类型参数是模板中最常用的参数形式,它允许我们将类型作为参数传递给模板。在实际开发中,类型参数有两种声明方式:
cpp复制template <class T> // 传统方式
template <typename T> // 更现代的方式
虽然class和typename在这里完全等价,但现代C++更推荐使用typename,原因有三:
- 语义更明确,表示这是一个类型参数
- 避免与类声明混淆
- 在嵌套依赖类型中必须使用typename
类型参数的应用场景非常广泛,比如STL中的vector、list等容器都是基于类型参数实现的。我们可以为类型参数指定默认值:
cpp复制template <typename T = int>
class Container {
// ...
};
注意:默认类型参数必须从右向左指定,即右边的参数有默认值后,左边的参数才能有默认值。
1.2 非类型参数实战
非类型参数允许我们将值作为模板参数传递,这些值必须是编译期常量。非类型参数的主要类型包括:
- 整型(int, long等)
- 枚举类型
- 指针/引用(C++11后支持nullptr_t)
一个典型的非类型参数应用是静态数组的实现:
cpp复制template <typename T, size_t N>
class StaticArray {
private:
T m_data[N];
public:
size_t size() const { return N; }
// ...
};
非类型参数有几个重要限制:
- 必须是编译期常量
- 浮点数不能作为非类型参数(C++20前)
- 字符串字面量不能直接作为非类型参数
实际开发技巧:非类型参数常用于实现编译期计算和优化,比如矩阵运算中的维度检查。
1.3 模板模板参数进阶
模板模板参数是C++模板中较为高级的特性,它允许将一个模板作为参数传递给另一个模板。这种技术常用于容器适配器的实现:
