나는 std::vector
을 소유하고있는 클래스를 가지고 있으며 begin()
, end()
, cbegin()
및 cend()
메서드를 제공해야합니다. 구현 세부 정보 (예 : std::vector
)를 사용하고 싶지 않으므로 직접 작성한 반복기가 있어야합니다. 내가 알기로, 이것은 boost::iterator_adapter
을위한 것입니다 : 새로운 iterator 타입을 가지고 반복자를 가져 와서 -> 내 std::vector<T>::iterator
이 MyClass::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;
};
이것은 컴파일되지 않을 수 있습니다.
"begin(), end(), cbegin() 및 cend()"를 전달하면 숨겨져 있지 않은 iterator를 래핑하여 무엇을 숨기고 있습니까? 나는 그것을 얻지 않는다. 여기서 성능이 중요하지 않으면 가장 쉽고 유연한 방법은 아마 any_iterator 일 것입니다 – lars