首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

stlport中这样使用模板有什么好处解决思路

2012-03-03 
stlport中这样使用模板有什么好处struct_List_node_base{_List_node_base*_M_next_List_node_base*_M_pre

stlport中这样使用模板有什么好处
struct     _List_node_base     {    
      _List_node_base*     _M_next;    
      _List_node_base*     _M_prev;    
};    
 
template     <class     _Dummy>    
class     _List_global     {    
public:    
      typedef     _List_node_base     _Node_base;    
      static     void         _STLP_CALL     _Transfer(_Node_base*     __position,    
                                                                                                                                              _Node_base*     __first,     _Node_base*     __last)    
 
typedef     _List_global <bool>     _List_global_inst    
 
使用:    
      void     splice(iterator     __position,     _Self&     __x)     {    
              if     (!__x.empty())    
                      _List_global_inst::_Transfer(__position._M_node,     __x.begin()._M_node,     __x.end()._M_node);    
         
感觉只是提供了一个名字空间,那还有必要用模板吗?把template     <class     _Dummy> 去掉不是更直观吗?

[解决办法]
模版的参数名为_Dummy,即哑元,就是说在类的实现中不会实际用到它。使用它来做相互间的区分。就如LZ所说,是类似名字空间的东西。
然而,就象名字空间是有用的,这个哑元也是有用的。对每个不同的实元,这个模版都可以有一个不同的特化实现。即bool对应一种_Transfer的实现(也可能它就用默认实现,无须特化),别的类型对应另一种实现。而调用者无须知道类型就可以自动链接到对应的实现上。
现在看到的只是最基本的一种实现,如果将来对这个模版的使用扩展了,如根据参数x的value_type做不同的_Transfer实现,那么void splice(iterator __position, _Self& __x) 就可以这样写:
if (!__x.empty())
_List_global <x::value_type> ::_Transfer(__position._M_node, __x.begin()._M_node, __x.end()._M_node);

然后为一些需要的x::value_type特化它的实现,其他的则使用默认的实现。
(注意我这里只是将这种技术的一般用途,而不是说具体这个模版的用途,它的作者可能并不用X::value_type做参数,而是其他什么)
在STL中大量使用了这种技术,包括函数参数哑元iterater_category族等,为的就是选择特定的实现,这可以看作是桥接(Bridge)模式的一种应用。

热点排行