Ответ Наваза интересен, но есть альтернативные решения.
Прежде всего, вы должны признать, что ваш агрегатор очень похож на Composite
модель.
Во-вторых, ябудет использоваться либо для:
- внешней итерации
for_each
-подобного метода-члена, в который передается функтор (фактически 2, из-за перегрузки const
).
Для внешней итерации читайте дальше:)
Относительно прискорбно, что синтаксис итератора C ++ на самом деле не ориентирован на «пропуск» итераторов, но, тем не менее, достижим.
class ActiveIterator {
public:
friend class FooAggregator;
friend bool operator==(ActiveIterator lhs, ActiveIterator rhs) {
return lhs._it == rhs._it;
}
ActiveIterator& operator++() {
this->next();
return *this;
}
Foo* operator->() const { return _it::operator->(); }
Foo& operator*() const { return *_it; }
private:
typedef std::vector<Foo>::iterator base;
ActivateIterator(base begin, base end): _it(begin), _end(end) {
if (_it == _end || _it->IsActive()) { return; }
this->next();
}
void next() {
++it; while (_it != _end && !_it->IsActive()) { ++_it; }
}
base _it, _end;
};
Тогда ваш агрегат просто имеет методы Begin
и End
, и вызывающий может взаимодействовать с вашими итераторами.
Примечание: вы можете сделать его шаблоном, чтобы иметь изменчивость/ const реализации за один раз
Внешняя итерация остается очень громоздкой, хотя в C ++ отсутствует синтаксис генератора, чтобы упростить задачу.