Генерация типов элементов для контейнеров - PullRequest
4 голосов
/ 24 февраля 2011

Когда я определяю свои собственные контейнеры, я должен предоставить дюжину типов элементов, например:

    typedef T& reference;
    typedef const T& const_reference;
    typedef T* iterator;
    typedef const T* const_iterator;
    typedef std::size_t size_type;
    typedef std::ptrdiff_t difference_type;
    typedef T value_type;
    typedef T* pointer;
    typedef const T* const_pointer;
    typedef std::reverse_iterator<iterator> reverse_iterator;
    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

Есть ли шаблон базового класса, от которого я могу наследовать, аналогично std::iterator<T> для моих собственных итераторов?

Ответы [ 3 ]

1 голос
/ 24 февраля 2011

Если вам нужно делать это часто, то, я думаю, вы могли бы создать

template<typename T>
struct container
{
    typedef T& reference;
    typedef const T& const_reference;
    typedef std::size_t size_type;
    typedef std::ptrdiff_t difference_type;
    typedef T value_type;
    typedef T* pointer;
    typedef const T* const_pointer;
};

и наследовать от этого.В стандартной библиотеке std::allocator определяет все эти определения типов, поэтому наследование от нее технически будет делать то, что вы хотели, и не должно налагать никаких накладных расходов во время выполнения.Я все еще думаю, что лучше просто написать свои собственные определения типов.

0 голосов
/ 24 февраля 2011

Для этой конкретной потребности есть boost :: iterator.

Надеюсь, этот урок прояснит ситуацию http://www.boost.org/doc/libs/1_46_0/libs/iterator/doc/iterator_facade.html#tutorial-example

0 голосов
/ 24 февраля 2011

Существует ли шаблон базового класса, от которого я могу наследовать, аналогично std::iterator<T> для моих собственных итераторов?

Нет, но это хорошая идея. OTOH, будет сложнее ссылаться на эти типы из контейнера, потому что они будут идентификаторами в базовом классе, зависящем от параметров шаблона производного класса. Это может стать неприятностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...