1. 非类型模板参数
在模板初阶部分就介绍过 类型形参,即出现在模板参数列表中,跟在 class 或者 typename 之类的参数类型名称。
值得注意的是,这里进行一点之前的补充。在模板初阶部分我们对 class 和 typename 进行了介绍,一般这两个参数类型是可以互相替换的,没啥区别,但是有一个特殊情况:
template<class Container>
void Print(const Container& v) {
Container::const_iterator it = v.begin();
while (it != v.end()) {
cout << *it << " ";
it++;
}
cout << endl;
}
当我们用模板参数来写 vector 数组的遍历的时候,Container::const_iterator 包含模板参数没有实例化,编译器无法确定 const_iterator 是个变量还是类型。因此应该写成 typename Container::const_iterator,typename 告诉编译器这里是类型,等模板实例化再去找。
为了满足某些特定情况下的需求,便有了 非类型模板参数。
例如:开辟一个静态数组时,有可能大了,也有可能小了。
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 _size; }
bool { == _size; }
:
T _array[N];
_size;
};
}


