非类型模板参看,顾名思义,模板参数不限定于类型,普通值也可作为模板参数。在基于类型的模板中,模板实例化时所依赖的是某一类型的模板参数,你定义了一些模板参数(template<typename T>)未加确定的代码,直到模板被实例化这些参数细节才真正被确定。而非类型模板参数,面对的未加确定的参数细节是指(value),而非类型。当要使用基于值的模板时,你必须显式地指定这些值,模板方可被实例化。
来看一个例子
template<typename T, int MAXSIZE>
class Stack
{
public:
Stack():idx(0){}
bool empty() const { return idx == 0;}
bool full() const { return idx == MAXSIZE;}
void push(const T&);
void pop();
T& top();
const T& top() const;
private:
int idx;
T elems[MAXSIZE];
}
template<typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::push(const T& elem)
{
if (full())
throw std::out_of_range("Stack<>::push(): full stack");
elems[idx++] = elem;
}
template<typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::pop()
{
if (!empty())
idx--;
else
throw std::out_of_range("Stack<>::pop(): empty stack")
}
template<typename T, int MAXSIZE>
T& Stack<T, MAXSIZE>::top()
{
if (empty())
throw std::out_of_range("Stack<>::top(): empty stack");
return elems[idx-1];
}
template<typename T, int MAXSIZE>
const T& Stack<T, MAXSIZE>::top() const
{
if (empty())
throw std::out_of_range("Stack<>::top(): empty stack");
return elems[idx-1];
}
使用方法
try
{
Stack<int, 10> int10Stack;
Stack<int, 20> int20Stack;
int20Stack.push(7);
...
}
catch(std::exception& ex)
{
cout << ex.what() << endl;
return EXIT_FAILURE;
}