Почему итератор списка имеет три аргумента шаблона в реализации SGI STL? - PullRequest
0 голосов
/ 29 июня 2018

У меня проблема при чтении реализации итератора списка SGI STL.

template<class T>
struct __list_node {
    void *prev;
    void *next;
    T data;
};

template<class T, class Ref, class Ptr>
struct __list_iterator {
    typedef __list_iterator<T, T&, T*> iterator;
    typedef __list_iterator<T, Ref, Ptr> self;
    ...
    typedef T value_type;
    typedef Ptr pointer;
    typedef Ref reference;
    typedef __list_node<T>* link_type;
    ...
    link_type node;
    ...
    reference operator*() const { return (*node).data; }
    pointer operator-> const { return &(operator*()); }
    self& operator++() { ... }
    self operator++(int) { ... }
    ...
    ...
};

Итак, почему существует три аргумента шаблона? Что если существует только class T? Что-то нравится ниже.

template<class T>
struct __list_iterator {
    typedef __list_iterator<T> iterator;
    typedef __list_iterator<T> self;
    ...
    typedef T value_type;
    typedef T* pointer;
    typedef T& reference;
    ...
    ...
};

Интересно, является ли три аргумента обязательным для какой-то конкретной class T или по какой-то причине, которую я не могу понять. Надеюсь, кто-нибудь может мне помочь. Большое спасибо!

1 Ответ

0 голосов
/ 29 июня 2018

Александр Степанов (изобретатель STL) объясняет, почему псевдонимы reference и pointer были введены в STL во время лекции 11 его курса Эффективное программирование с компонентами .

Короче говоря, Степанов изначально думал, что - учитывая итератор it, можно смело предположить, что *it имеет тип value_type&, а &*it - value_type*. Тем не менее, Microsoft заявила, что проголосует против включения STL в стандарт, если она не может вместить несколько моделей памяти, которые в то время включали модели с крошечными, огромными и длинными указателями. Поэтому введение reference и pointer. Цитирую его из лекции:

«Это не особенно вредно, но затуманивает вещи. Его, конечно, любят специалисты по языку; оно обеспечивает им постоянную работу».

Забавный аспект заключается в том, что даже если Степанов изменил всю архитектуру STL в попытке удовлетворить его запросы, Microsoft все равно решила проголосовать против включения.

Соответствующая часть класса здесь .

...