C 类模板特化基本概念概述
创始人
2024-06-22 18:01:14
0次

我们在上一篇文章中为大家详细介绍了C++类模板的具体应用方式,相比朋友们应该可以从中对类模板有一个充份的认识。那么C++类模板特化又是如何进行的呢?其实,C++类模板特化被描述为一个和重载类似的概念。

我的理解是,特化允许我们对某些特殊的参数(这里就是类型)进行特殊的处理。C++类模板特化的处理都是在类名后面做文章的。特化分为全局特化和局部特化。对于全局特化,书中的例子是希望对于Stack< T>模板,如果参数为std::string的类型,就用deque作为容器来处理,而其他的保持不变。因此,我们需要对Stack< T>模板作std::string的特化处理。代码如下:

 

  1. #include < deque> 
  2. #include < string> 
  3. #include < stdexcept> 
  4. #include "Stack.h"  
  5. template< > 
  6. class Stack< std::string>{  
  7. private:  
  8. std::deque< std::string> elems;  
  9. public:  
  10. void push(std::string const&);  
  11. void pop();  
  12. std::string top() const;  
  13. bool empty() const{  
  14. return elems.empty();  
  15. }  
  16. };  
  17. void Stack< std::string>::push(std::string const& elem)  
  18. {  
  19. elems.push_back(elem);  
  20. }  
  21. void Stack< std::string>::pop()  
  22. {  
  23. if(elems.empty())  
  24. {  
  25. throw std::out_of_range("Stack< std::string>::pop()==> empty stack.");  
  26. }  
  27. elems.pop_back();  
  28. }  
  29. std::string Stack< std::string>::top() const  
  30. {  
  31. if(elems.empty())  
  32. {  
  33. throw std::out_of_range("Stack< std::string>::pop()==> empty stack.");  
  34. }  
  35. return elems.back();  
  36. } 

注意到C++类模板特化的定义和普通的类模板完全不一样了。主要区别有:#t#

特化类模板的前面加上了template< >,没有指定参数。而是在类名后面指定了类型参数。

在函数的定义里面,原来的类型T全部换成了特化的类型std::string。实际上,完全可以根据特殊需要重写成员函数。甚至可以定义另外的函数。

将上面的源代码加入到工程中,编译运行。就会发现当使用std::string去实例化stack的时候实际上调用的是StringStack文件中的"重载"版本。各个方法的调用也一样。也就是说,特化实际上是要求对特定的参数施行特殊的处理。从这个方面来说和重载确实很类似。

但是,我认为特征化和重载还是有区别的。试想有一个函数Func(int, int),另外一个函数对它进行重载为Func(string, string)。在实际上我们也可以说int的Func重载了string的Func,这是相互的。但是特化却不能这么说。因为特化是对某种类型的特殊处理,我们可以说特化模板重载了某个模板,但是不能说某个模板重载了特化的模板。这是单方向的。另外,如果,我们不需要Func(int, int)函数,我们完全可以把它删去。但是C++类模板特化不能离开它依赖的类模板单独存在。在上面的例子中,如果删除Stack.h文件,StringStack.h文件的定义就会出错。

StringStack是Stack模板的特化。但是他们之间的联系其实不是那么紧密,除了名字上以外。例如,Stack模板中的成员函数不必非得在StringStack中出现;同理,StringStack中的函数也不必是Stack中的函数。也就是说,特化的模板类可以根据自己的需要完全重写指定的模板函数,也可以弃原来模板函数中的成员不用,另外定义成员函数。这方面没有限制。

在理解了全局的特化以后,在来看局部的特化就很容易明白了。局部特化是要求在指定的条件下使用指定的类模板的重载版本。

相关内容

热门资讯

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