2017-05-23 18 views
0

我有一类拥有std::vector,应提供begin(),end(),cbegin()cend()方法。由于我不想公开实现细节,即我使用的是std::vector,所以我必须拥有自己的迭代器。据我所知,这是什么boost::iterator_adapter是什么:它需要一些迭代器,并在一个新的迭代器类型 - >我的std::vector<T>::iterator成为然后MyClass::iterator包装它。当使用boost :: iterator_adapter实现自定义迭代器时,可以使用相同的类作为mutable和const迭代器吗?

首先,我对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; 
    }; 

这可能不会编译。

+0

如果你只是转发“begin(),end(),cbegin()和cend()”,你通过包装迭代器隐藏了什么?我不明白。 如果性能在这里不重要,他们最简单和最灵活的方式可能只是一个any_iterator – lars

回答

2

不,你不能使用类似的东西:using const_iterator = const iterator

A const_iteratorT const *一样工作。 A const iterator的作用类似于T * const

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

相关问题