程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++非類型類模板參數基本概念正確理解

C++非類型類模板參數基本概念正確理解

編輯:C++入門知識

C++編程語言已經出現就立即引起了開發人員的注意,它具有C語言的所用功能,並能支持許多程序設計風格。我們今天要為大家介紹的則是C++非類型類模板參數的一些基本概念,讓大家對這方面的內容有一個更加深入的了解。

我認為C++非類型類模板參數相當於一個全局常量的角色。書中舉了下面的例子來說明非類型的類模板。這一章通過重新定義一個Stack模板,要求使用一個固定大小的數組作為元素的容器,並且數組的大小可以由模板的使用者自己定義。那麼,對於模板的設計者,就應該提供一個接口使得使用者可以定義數組的大小。這就需要用到非類型的類模板參數。下面的代碼能很好的解釋這個問題:

  1. #include < iostream> 
  2. #include < string> 
  3. #include < cstdlib> 
  4. #include < stdexcept> 
  5. template< typename T, int MAXSIZE> 
  6. class Stack{  
  7. private:  
  8. T elems[MAXSIZE];  
  9. int numElems;  
  10. public:  
  11. Stack();  
  12. void push(T const&);  
  13. void pop();  
  14. T top() const;  
  15. bool isEmpty() const{  
  16. return numElems == 0;  
  17. }  
  18. bool isFull() const{  
  19. return numElems == MAXSIZE;  
  20. }  
  21. };  
  22. template< typename T, int MAXSIZE> 
  23. Stack< T, MAXSIZE>::Stack():numElems(0)  
  24. {  
  25. // 不作任何事,僅為了初始化numElems。  
  26. }  
  27. template< typename T, int MAXSIZE> 
  28. void Stack< T, MAXSIZE>::push(T const& elem)  
  29. {  
  30. if(numElems == MAXSIZE)  
  31. {  
  32. throw std::out_of_range("Stack< >::push()==>stack is full.");  
  33. }  
  34. elems[numElems] = elem;  
  35. ++numElems;  
  36. }  
  37. template< typename T, int MAXSIZE> 
  38. void Stack< T, MAXSIZE>::pop()  
  39. {  
  40. 47 if(numElems < = 0)  
  41. {  
  42. throw std::out_of_range("Stack< >::pop: empty stack");  
  43. }  
  44. --numElems;  
  45. }  
  46. template< typename T, int MAXSIZE> 
  47. T Stack< T, MAXSIZE>::top()const  
  48. {  
  49. if(numElems)  
  50. {  
  51. throw std::out_of_range("Stack< >::pop: empty stack");  
  52. }  
  53. // 返回最後一個元素。  
  54. return elems[numElems - 1];  
  55. }  
  56. int main()  
  57. {  
  58. try  
  59. {  
  60. Stack< int, 20> int20Stack;  
  61. Stack< int, 40> int40Stack;  
  62. Stack< std::string, 40> stringStack;  
  63. int20Stack.push(7);  
  64. std::cout< < "int20Stack.top() : "< < int20Stack.top()< < std::endl;  
  65. int20Stack.pop();  
  66. stringStack.push("HelloWorld!");  
  67. std::cout< < "stringStack.top() : "< < stringStack.top()< < std::endl;  
  68. stringStack.pop();  
  69. stringStack.pop();  
  70. }  
  71. catch(std::exception const& ex)  
  72. {  
  73. std::cerr< < "Exception: "< < ex.what()< < std::endl;  
  74. return EXIT_FAILURE;  
  75. }  
  76. return 0;  

上面的代碼揭示了C++非類型類模板參數的定義和使用方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved