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. C++类模板特化基本概念概述
  2. C++类模板应用代码深入剖析
  3. C++数组参数应用方式探讨
  4. C++获取当前路径实现技巧分享
  5. C++反射机制具体实现方法详解
责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-04 13:56:24

C++类模板特化

2010-02-03 11:11:18

C++类型转换

2010-02-01 10:54:37

C++框架

2010-02-02 13:41:01

C++类继承

2010-02-05 17:34:37

C++函数模板

2010-02-04 15:05:00

C++ cpuid指令

2010-02-04 17:39:48

C++字符串类型

2010-02-04 14:22:25

C++函数模板非类型参

2010-02-05 12:57:20

C++ kdevelo

2010-02-02 10:33:22

C++引用

2010-02-03 13:22:07

C++时间

2010-02-02 15:30:05

C++ include

2010-02-01 17:24:41

C++循环语句

2010-02-03 14:36:47

C++仿函数

2010-02-03 17:42:33

C++模板参数

2010-02-06 14:04:58

C++内存使用机制

2010-02-04 10:08:00

C++静态成员函数

2010-02-23 17:55:24

WCF双向通信

2010-02-01 14:07:12

C++多态性

2009-12-07 14:53:13

PHP抽象类应用
点赞
收藏

51CTO技术栈公众号