c++ template(三)

对于函数模板和类模板的参数并不局限于类型,普通值也可以作为模板的参数。那非类型的模板形参有什么用呢?在什么情况下我们要使用非类型的模板形参呢?答:当我们构建栈模板时,为了更好的使用栈模板,我们可以让用户自定义栈的大小。也就是说在一些特定的情况下,为了满足要求必须让用户自定义一些所设计的东西的大小,这时候我们就需要为模板指定非类型的参数。

  • 首先我们先来看看类模板的非类型模板实参

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;
}

那么是不是模板的非类型参数可以取任意类型呢?

答:不是

  • 空指针常量。因为空指针无法确定类型,而且模板中不允许类型转换。
  • 浮点数。历史原因。
  • 字符串。
发布了50 篇原创文章 · 获赞 11 · 访问量 4108

猜你喜欢

转载自blog.csdn.net/qq_43145594/article/details/90147578