对于函数模板和类模板的参数并不局限于类型,普通值也可以作为模板的参数。那非类型的模板形参有什么用呢?在什么情况下我们要使用非类型的模板形参呢?答:当我们构建栈模板时,为了更好的使用栈模板,我们可以让用户自定义栈的大小。也就是说在一些特定的情况下,为了满足要求必须让用户自定义一些所设计的东西的大小,这时候我们就需要为模板指定非类型的参数。
- 首先我们先来看看类模板的非类型模板实参
template<typename T,const std::size_t MAXSIZE > //const std::size_t MAXSIZE=100
class Stack { //也可以显示的指定缺省值,但一般弹性较差,所以不建议
public:
void push(const T& elem);
private:
T Elems[MAXSIZE];
std::size_t elemnumbers;
};
template<typename T,const std::size_t MAXSIZE>
void Stack<T, MAXSIZE>::push(const T& elem) {
if (elemnumbers < MAXSIZE - 1)
Elems[elemnumbers] = elem;
else
throw std::out_of_range("Stack is fill");
}
那函数模板可以指定非类型的函数模板实参吗?当然可以啦^*^
template<const std::size_t MAXSIZE>
std::size_t stack(std::size_t size) {
return MAXSIZE + size;
}
那么是不是模板的非类型参数可以取任意类型呢?
答:不是
- 空指针常量。因为空指针无法确定类型,而且模板中不允许类型转换。
- 浮点数。历史原因。
- 字符串。