Я пытаюсь реализовать полиморфный итератор в С++. В принципе, мне нужно это, чтобы иметь возможность применять фильтр, чтобы итератор пропускал некоторые элементы в зависимости от соответствующего условия. Поэтому я сделал GoF-like итератор с абстрактным интерфейсом, это позволяет мне выводить из него отфильтрованный итератор и реализовывать требуемую логику. Я также предпочитаю итераторы на основе интерфейса над шаблонами, поскольку они позволяют скрыть реализацию, не приводя к беспорядку шаблонов, напечатанных в стиле утки.
Однако полиморфные итераторы не могут быть возвращены значением (в отличие от итераторов STL), поэтому мне нужно передать указатели, и это может стать опасным, как в этом случае, что кажется логичным, но приводит к утечке памяти:
Iter* Collection::GetIter() {...} // new IterImpl
DoSomething(Iter*) {...} // doesn't do delete
DoSomething(Collection.GetIter()); // convenient, but wrong :\
Очевидным решением является использование каких-то умных указателей для управления временем жизни итераторов, но люди часто говорят, что интерфейсы должны быть максимально простыми и общими, поэтому следует избегать таких умных указателей?
Если вы работали с полиморфными итераторами на С++, как эта проблема была решена? Или итераторы на основе шаблонов являются единственным "хорошим" способом итерации на С++? Спасибо.