1. 非类型模板参数
模板参数分为类型形参与非类型形参。
类型形参即:出现在模板参数列表中,跟在 class 或 typename 之类的后面的参数类型名称。
非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
namespace Achieve {
// 定义一个模板类型的静态数组
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 _size; }
bool empty() const { return _size == 0; }
private:
T _array[N];
size_t _size;
};
}
注意:
- 浮点数、类对象以及字符串是不允许作为非类型模板参数的。(只有整形可以,像 int、long、无符号整形、bool 等)。(C++20 支持 double)
- 非类型的模板参数必须在编译期就能确认结果。
2. 模板的特化
2.1 概念
通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能回得到一些错误的结果,需要特殊处理。如:实现了一个专门用来进行小于比较的函数模板。
// 函数模板——参数匹配
template<class T> bool Less(T left, T right) {
return left < right;
}
{
cout << (, ) << endl;
;
;
cout << (d1, d2) << endl;
Date* p1 = &d1;
Date* p2 = &d2;
cout << (p1, p2) << endl;
;
}


