Здравствуйте, Vain, Вы писали:
V>Надо мне было сделать полиморфный итератор, т.е. чистый интерфейс для итератора, т.к. типы которые итерируются — неизвестны на стадии компиляции. Интерфейс примерно такой: V>Можно ли как-нибудь обойтись без этого m_asForward? Почему итераторы для двунаправленных контейнеров — однонаправленные?
подождите. Вы хотите начинать итерирование как с конца, так и сначала, и осуществлять его в обоих направлениях, так?
для того, чтобы начать, нужно знать, откуда, и эта информация у метода start есть.
для того, чтобы совершить итерацию, нужно знать, в какую сторону, и эта информация у метода step тоже есть.
теперь нужно выяснить, какова логика метода done.
варианта здесь я вижу 2 —
1. done() == true при достижении последнего элемента при старте с первого(и наоборот, первого при старте с последнего)
2. done() == true при невозможности итерироваться в сторону, в которую была совершена последняя итерация ( как это сделано у Вас, если раскомментировать обращения к m_asForward, обратите внимание, если на самом деле нужно другое )
и в обоих случаях, нужно знать, а что же является последним элементом для текущего процесса итерации.
на мой взгляд, простейшим вариантом как раз и будет флаг направления, можно конечно и итератор на последний элемент хранить, либо даже функтор, возвращающий итератор на последний элемент.