使用boost :: iterator_adapter实现自定义迭代器时,我可以对mutable和const Iterators使用相同的类吗?

时间:2017-05-23 13:39:09

标签: c++ boost iterator boost-iterators

我有一个拥有std::vector的课程,应该提供begin()end()cbegin()cend()方法。由于我不想暴露实现细节,即我使用std::vector,我必须拥有自己的迭代器。据我所知,这就是boost::iterator_adapter的用途:它需要一些迭代器并将其包装在一个新的Iterator类型中 - &gt;我的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 个答案:

答案 0 :(得分:2)

不,你不能使用:using const_iterator = const iterator

const_iterator就像T const *一样。 const iterator的工作方式类似于T * const

也就是说,你想要的是一个迭代器,它可以被修改为指向其他对象,但提供对这些对象的只读访问。相反,const iterator给你的是一个迭代器,它本身不能被修改,但是对它引用的对象提供读/写访问权。