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)模式的一种应用。