引言
模板是 C++ 中最强大、最具特色的功能之一。它使得编写通用的、与数据类型无关的代码成为可能,从而提升代码复用性与可维护性。在开发过程中,理解模板的进阶用法,包括非类型模板参数、模板特化、模板的分离编译等,可以极大提高我们对模板机制的掌握,写出更加灵活和高效的代码。
本文将系统性地介绍 C++ 模板的进阶用法,重点放在非类型模板参数、模板特化(包括全特化和偏特化)、以及模板的分离编译,并通过丰富的代码示例进行论证,让读者可以更深刻理解这些特性及其应用场景。
1. 非类型模板参数
1.1 概念
C++ 中,模板参数不仅仅可以是类型参数,还可以是非类型参数。非类型模板参数是一种在编译期就能够确定的常量,其可以是整数、指针或引用等,但不允许是浮点数、类对象或者字符串。使用非类型模板参数可以实现更灵活的模板设计。
例如,我们可以用一个常量作为类模板的参数,来定义具有固定大小的数组类:
#include <iostream>
namespace bite {
template<class T, size_t N = 10>
class Array {
public:
T& operator[](size_t index) { return _array[index]; }
const T& operator[](size_t index) const { return _array[index]; }
size_t size() const { return N; }
bool empty() const { return N == 0; }
private:
T _array[N];
};
}
int main() {
bite::Array<int, 5> arr;
for (size_t i = 0; i < arr.size(); ++i) {
arr[i] = <>(i);
}
( i = ; i < arr.(); ++i) {
std::cout << arr[i] << ;
}
;
}


