полиморфные итераторы в C ++

Я пытаюсь реализовать полиморфный итератор на C ++. По сути, мне это нужно, чтобы иметь возможность применить фильтр, чтобы итератор пропускал некоторые элементы в зависимости от связанного условия. Итак, я сделал итератор GoF-подобный с абстрактным интерфейсом, это позволяет мне получить отфильтрованный итератор из него и реализовать необходимую логику. Я также предпочитаю итераторы на основе интерфейса шаблонным, поскольку они позволяют скрыть реализацию, не приводя к беспорядку шаблонов типа «утка».

Однако полиморфные итераторы не могут быть возвращены по значению (в отличие от итераторов STL), поэтому у меня есть передавать указатели, и это может легко стать опасным, как в этом случае, что кажется логичным, но приводит к утечке памяти:

Iter* Collection::GetIter() {...} // new IterImpl
DoSomething(Iter*) {...} // doesn't do delete

DoSomething(Collection.GetIter()); // convenient, but wrong :\

Очевидное решение - использовать какие-то умные указатели для управления временем жизни итераторов, но люди часто говорят, что интерфейсы должны быть как можно более простыми и общими, поэтому умных указателей, вероятно, следует избегать?

Если вы работали с полиморфными итераторами в C ++, как была решена эта проблема? Или итераторы на основе шаблонов - единственный «хороший» способ итерации в C ++? Спасибо.

16
задан Roman L 31 January 2011 в 15:32
поделиться