对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数。在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定。但是在这里,我们面对的是这些细节是值,而不是类型,当要使用基于值的模板时,必须显式地指定这些值,才能够对模板进行实例化。
在上篇文章(C++类模板)中我们介绍了一个stack类模板作为例子,下面将看一个新版本的stack模板,来叙述本文将要介绍的特性:
非类型的类模板参数
创建类的头文件
#include
#include
using namespace std;
template
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
Stack::Stack():numElems(0) {}
template
void Stack::push(T const& elem)
{
if(numElems == MAXSIZE) {
throw out_of_range("Stack<>::push(): stack is full");
}
elems[numElems] = elem;
++numElems;
}
template
void Stack::pop()
{
if(numElems <= 0) {
throw out_of_range("Stack<>::pop(): stack is full");
}
--numElems;
}
template
T Stack::top() const
{
if(numElems <= 0) {
throw out_of_range("Stack<>::top(): stack is full");
}
return elems[numElems - 1];
}
stack4.h
实现代码:
#include
#include
#include
#include
#include
#include
#include "stack4.h"
using namespace std;
int main()
{
try {
Stack int20Stack;
Stack int40Stack;
Stack stringStack;
int20Stack.push(7);
cout<
int20Stack.pop();
stringStack.push("hello");
cout<
stringStack.pop();
stringStack.pop();
}
catch(exception const& ex) {
cerr<<"Exception: "<
//return EXIT_FAILURE;
}
cin.get();
return 0;
}
main