C Templates学习笔记三:非类型模板参数

对于函数模板和类模板,模板参数并不局限于类型,值也可以作为模板参数。


一:非类型的类模板参数

实例:

template<typename T, int MAXSIZE>
class Stack
{
private:
	T elems[MAXSIZE];
	int numElems;

public:
	Stack();
	void push(T const&);
	void pop();
	T top() const;
	bool empty() const {
		return numElems == 0;
	}
	bool full() const {
		return numElems == MAXSIZE;
	}
};

template<typename T, int MAXSIZE>
Stack<T, MAXSIZE>::Stack():
	numElems(0)
{

}

template<typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::push(T const& elem)
{
	if (numElems == MAXSIZE) {
		throw std::out_of_range("Stack<>::push(): stack is full");
	}

	elemsp[numElems] = elem;
	numElems++;
}

template<typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::pop()
{
	if (numElems < 1)
	{
		throw std::out_of_range("Stack<>::pop(): stack is empty");
	}
	--numElems;
}

template<typename T, int MAXSIZE>
T Stack<T, MAXSIZE>::top() const
{
	if (numElems < 1)
	{
		throw std::out_of_range("Stack<>::top() : stack is empty");
	}
	return elems[numElems - 1];
}

Stack<int, 20> int20Stack;

Stack<int,40> int40Stack;

这是两个不同类型的模板实例,不能互相替换或者赋值。

二:非类型的函数模板参数

template<typename T, int VAL>
T addvalue(T const& x)
{
	return x + VAL;
}

三:一些限制

可以是常整数(包括枚举值) 或者指向外部链接对象的指针。

浮点数和类对象不允许作为非类型模板参数。

string是内部链接对象。

发布了35 篇原创文章 · 获赞 5 · 访问量 424

猜你喜欢

转载自blog.csdn.net/qq_33776188/article/details/102934863