參考《C++ Templates》一書。
關於函式模板和類别範本,模板引數並不侷限於型別,普通值也可以作為模板引數。
當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項化,並獲得最終程式碼。
詳細解釋可參考一下程式碼:
stack4.hpp
#ifndef _STACK4_H_ #define _STACK4_H_ #include <stdexcept> /** * @class:棧的類别範本 * @param: typename T: 模板引數,棧儲存元素的型別 * @param:int MAXSIZE: 棧元素的最大個數 * note:模板引數並不侷限於型別,普通值也可以作為模板引數 */ 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"); } elems[numElems] = elem; //壓入元素 ++numElems; //增加元素個數 } //彈出元素///////////////////////////////////////////// template<typename T, int MAXSIZE> void Stack<T, MAXSIZE>::pop() { if(numElems <= 0) throw std::out_of_range("Stack<>::pop(): empty stack"); --numElems; //減少元素個數 } //返回棧頂元素///////////////////////////////////////// template<typename T, int MAXSIZE> T Stack<T, MAXSIZE>::top() const { if(numElems <= 0) throw std::out_of_range("Stack<>::pop(): empty stack"); return elems[numElems - 1]; //返回最後一個元素 } #endif
main.cpp
/************************************************************************ * @filename: non-type template parameters * @author: JackyLiu * @Date: 2013-6-26 *************************************************************************/ #include <iostream> #include <string> #include <cstdlib> #include "stack4.hpp" int main(int argc, char* argv[]) { try { Stack<int, 20> int20Stack; //可以儲存20個int元素的棧 Stack<int, 40> int40Stack; //可以儲存40個int元素的棧 Stack<std::string, 40> stringStack; //可以儲存40個string元素的棧 //使用可儲存20個int元素的棧 int20Stack.push(7); std::cout << int20Stack.top() << std::endl; int20Stack.pop(); //使用可儲存40個string元素的棧 stringStack.push("hello"); std::cout << stringStack.top() << std::endl; stringStack.pop(); stringStack.pop(); } catch(std::exception const& ex) { std::cerr << "Exception: " << ex.what() << std::endl; int i; std::cin >> i; return EXIT_FAILURE; //退出程式且有ERROR標記 } }
執行結果: