Могу ли я использовать один и тот же класс для изменяемых и константных итераторов при реализации пользовательского итератора с помощью boost::iterator_adapter?

У меня есть класс, который владеет std::vector и должен обеспечить begin(), end(), cbegin() а также cend() методы. Поскольку я не хочу раскрывать детали реализации, то есть использовать std::vector Я должен иметь свой собственный итератор. Как я понял, это то, что boost::iterator_adapter для: он берет некоторый итератор и оборачивает его в новый тип итератора -> мой std::vector<T>::iterator становится потом MyClass::iterator,

Во-первых, верно ли мое понимание boost::iterator_adapter, и во-вторых, я могу избежать необходимости писать второй const_iterator и вместо этого, например, typedef it (using const_iterator = const iterator)?

    class MyClass {
    public:
        iterator begin();
        // ...
    private:
        using container_t = std::vector;
        container_t<int> container;
    }

    class MyClass::iterator
      : public boost::iterator_adaptor<
            MyClass::iterator                     // Derived
          , container_t<int>::iterator            // Base
          , boost::use_default                    // Value
          , boost::random_access_traversal_tag >  // CategoryOrTraversal
    {
     public:
        iterator()
          : iterator::iterator_adaptor_() {}
        explicit iterator(const iterator::iterator_adaptor_::base_type& p)
          : iterator::iterator_adaptor_(p) {}
     private:
        friend class boost::iterator_core_access;
    };

это может не скомпилироваться.

1 ответ

Нет, вы не можете использовать что-то вроде: using const_iterator = const iterator,

const_iterator работает как T const *, const iterator работает как T * const,

То есть вам нужен итератор, который можно изменить, чтобы он указывал на другие объекты, но обеспечивает доступ к этим объектам только для чтения. Какие const iterator вместо этого даст вам итератор, который сам по себе не может быть изменен, но дает доступ на чтение / запись к объекту, на который он ссылается.

Другие вопросы по тегам