2017-05-23 6 views
0

나는 std::vector을 소유하고있는 클래스를 가지고 있으며 begin(), end(), cbegin()cend() 메서드를 제공해야합니다. 구현 세부 정보 (예 : std::vector)를 사용하고 싶지 않으므로 직접 작성한 반복기가 있어야합니다. 내가 알기로, 이것은 boost::iterator_adapter을위한 것입니다 : 새로운 iterator 타입을 가지고 반복자를 가져 와서 -> 내 std::vector<T>::iteratorMyClass::iterator이됩니다.boost :: iterator_adapter를 사용하여 사용자 정의 Iterator를 구현할 때 mutable 및 const 반복자에 대해 동일한 클래스를 사용할 수 있습니까?

우선, boost :: iterator_adapter에 대한 제 이해가 정확하고 두 번째는 두 번째 const_iterator를 작성하지 않고 대신 예를 들어서 피할 수 있습니다. 그것을 typedef (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()"를 전달하면 숨겨져 있지 않은 iterator를 래핑하여 무엇을 숨기고 있습니까? 나는 그것을 얻지 않는다. 여기서 성능이 중요하지 않으면 가장 쉽고 유연한 방법은 아마 any_iterator 일 것입니다 – lars

답변

2

아니요, 아니요. using const_iterator = const iterator과 같은 것을 사용할 수 없습니다.

const_iteratorT const *처럼 작동합니다. const iteratorT * const처럼 작동합니다.

즉, 원하는 것은 다른 객체를 가리 키도록 수정할 수 있지만 해당 객체에 대한 읽기 전용 액세스를 제공하는 반복기입니다. const iterator은 대신 자체적으로 수정할 수는 없지만 참조하는 객체에 대한 읽기/쓰기 액세스 권한을 제공하는 반복기입니다.