Могу ли я использовать один и тот же класс для изменяемых и константных итераторов при реализации пользовательского итератора с помощью 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
вместо этого даст вам итератор, который сам по себе не может быть изменен, но дает доступ на чтение / запись к объекту, на который он ссылается.