у меня есть класс, который имеет частную коллекцию std::shared_ptr
с, как:Выведение из стандартных контейнеров итераторов
class Foo
{
private:
using Bars = std::vector<std::shared_ptr<Bar>>;
Bars items_;
}
Учитывая экземпляр Foo
, я хочу, чтобы иметь возможность перебирать Bar
объектов в items_
непосредственно - скрывать, что коллекция фактически содержит указатели. Я считаю, что единственное, что нужно изменить с Bars::const_iterator
, это operator*
, это нормально, чтобы просто извлечь из него и реализовать operator*
? т.е.
class Iterator : public Bars::const_iterator
{
public:
Iterator(Bars::const_iterator it) : Bars::const_iterator {it} {}
const string& operator*() const
{
return *Bars::const_iterator::operator*();
}
};
А затем обеспечить begin
и end
методы Foo
:
Foo::Iterator Foo::begin() const noexcept { return Iterator {std::cbegin(items_)}; }
Foo::Iterator Foo::end() const noexcept { return Iterator {std::cend(items_)}; }
Вы можете безопасно получить практически из любого класса при условии, что наследование является приватным. Вам понадобится декларация 'using' для повторного экспорта членов, которые вы хотите получить. –