对于函数模板和类模板,模板参数并不局限于类型,值也可以作为模板参数。
一:非类型的类模板参数
实例:
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是内部链接对象。