非类型模版参数
在之前的章节中,模版参数通常当作类型来处理。实际上,模版参数还有非类型模版参数。
非类型形参,就是用一个常量作为类 (函数) 模板的一个参数,在类 (函数) 模板中可将该参数当成常量来使用。
#define N 10
template<class T> class myvector {
public:
//...
private:
T _arr[N];
int _capacity;
};
int main() {
myvector<int> v1;
myvector<double> v2;
return 0;
}
在上面这段程序当中,N 的大小是确定的。如果要插入 100 个数据时,N 是 10 是不够的,需要手动将 N 的大小进行修改;当要插入 10 个数据时,N 是 100 又太多了,导致很多空间被浪费。因此存在局限性,如果使用非类型模版参数可以改善这种问题。
template<class T,size_t N> class myvector {
public:
//...
private:
T _arr[N];
int _capacity;
};
此时 N 的大小我们可以自行决定。此时一个 double 类型的 vector 要开 100 个空间:
myvector<double, 100> v;
int 类型的 vector 要开 10 个空间:
myvector<int, 10> v;
实际上,在 C++ 库中的 array(数组)也是这样处理的,那它又和 int array[N] 有什么区别呢?
C 语言中的 int array 对越界问题检查实际是不严格的。
C++ 中 array 对越界问题的检查。
需要注意的是:
- 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
- 非类型的模板参数必须在编译期就能确认结果。


