STL list_iterator код вопроса (STL 4.0.0) - PullRequest
2 голосов
/ 10 октября 2009

Может кто-нибудь объяснить, почему _List_const_iterator использует _List_node_base и при необходимости понижает его до _List_node? - Думаю, за этим должна быть какая-то причина.

Спасибо

struct _List_node_base
{

    _List_node_base* _M_next;   ///< Self-explanatory
    _List_node_base* _M_prev;   ///< Self-explanatory
    // ...
};

template<typename _Tp> 
struct _List_node : public _List_node_base

{
    _Tp _M_data;                ///< User's data.
};


template<typename _Tp>
struct _List_const_iterator {

    // Must downcast from List_node_base to _List_node to get to
    // _M_data.
    reference operator*() const
    { return static_cast<_Node*>(_M_node)->_M_data; }

    // ...
    // The only member points to the %list element.
    const _List_node_base* _M_node;  ///WHY NOT USING _List_node here?
};

Ответы [ 2 ]

2 голосов
/ 10 октября 2009

Я предполагаю, что _M_node имеет тип _List_node_base*, так что его можно назначить / инициализировать с помощью _M_next и / или _M_prev (который, как вы показали, имеет тип _List_node_base*).

Интересно, почему вообще существует класс _List_node_base вместо того, чтобы объявлять _M_next и _M_prev членами класса _List_node. Одной из причин может быть уменьшение количества сгенерированного кода: если у вас много разных специализаций класса _List_node, то большая часть (если не все) его кода / реализации в неуниверсальном базовом классе уменьшает количество сгенерированного кода .

1 голос
/ 29 апреля 2012

Это из комментария о реализации EASTL list.h-

https://github.com/paulhodge/EASTL/blob/d77d94b0d75399ac957d683ef84a8557b0f93df2/include/EASTL/list.h

/// ListNodeBase
///
/// We define a ListNodeBase separately from ListNode (below), because it allows
/// us to have non-templated operations such as insert, remove (below), and it
/// makes it so that the list anchor node doesn't carry a T with it, which would
/// waste space and possibly lead to surprising the user due to extra Ts existing
/// that the user didn't explicitly create. The downside to all of this is that
/// it makes debug viewing of a list harder, given that the node pointers are of
/// type ListNodeBase and not ListNode. However, see ListNodeBaseProxy below.
///
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...