非类型模板参数

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

【非类型模板参数】使用方法
try { Stack int10Stack; Stack int20Stack; int20Stack.push(7); ... } catch(std::exception& ex) { cout << ex.what() << endl; return EXIT_FAILURE; }

    推荐阅读