C 非类型类模板参数基本概念正确理解
创始人
2024-06-22 18:10:46
0次

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;  
  77. } 

上面的代码揭示了C++非类型类模板参数的定义和使用方法。

【编辑推荐】

  1. C++类模板特化基本概念概述
  2. C++类模板应用代码深入剖析
  3. C++数组参数应用方式探讨
  4. C++获取当前路径实现技巧分享
  5. C++反射机制具体实现方法详解

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
只需三步,让你掌握阿尔法路由器... 请参照以下阿尔法路由器设置方法,通过浏览器进入及设置宽带路由器。经过这三个步骤的设置,基本上能够熟悉...
如何更省钱? 近期特价热门硒鼓... 如今激光打印设备已经成为商务或企业的绝对主力办公设备,但采购者往往忽视了激光打印设备所用的耗材,相对...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...