AnyIterator и буст итератор фасад - PullRequest
5 голосов
/ 22 февраля 2011

Можно ли реализовать какой-либо итератор с фасадом boost итератора? Я не хочу определять детали реализации в моем базовом классе

class Base
{
public:
typedef std::vector<int>::iterator iterator;//implementation detail
...
virtual iterator begin()=0;
virtual iterator end()=0;
};

или мне нужно написать полностью с нуля;

Ответы [ 2 ]

9 голосов
/ 23 февраля 2011

Код, который вы разместили, исправил тип итераторов, возвращаемых с Base, и все его реализации к std::vector<int>::iterator, что, вероятно, не то, что вам нужно.Предложение Иеремии - один из способов преодолеть один недостаток: вы теряете совместимость с STL ... Мне известны три реализации полиморфной оболочки-итератора:

  1. Беккер any_iterator (которая реализует boost::iterator_facade)
  2. библиотека opaque_iterator (Google для нее) или
  3. Очень интересная поли-библиотека Adobe, которая содержит иерархию STL, соответствующую any_iterator s.

Проблема сложнее, чем может показаться ... Я попытался сам, главным образом потому, что мне была нужна ковариация в аргументе типа any_iterators (any_iterator<Derived> должен быть автоматически преобразован в any_iterator<Base>), что трудно реализовать чисто с помощью итераторов, подобных STL,AC # like Enumerator<T> проще в реализации (*) (и imho, как правило, более чистая концепция, чем STL-подобные пары итераторов), но опять же, вы «теряете» STL.

(*) = без 'даешь конечно: -)

3 голосов
/ 08 апреля 2011

Я думаю, это может быть то, что вы ищете:

any_iterator: Type Erasure для C ++ Iterators

Вот фрагмент изта страница ::

Обзор

Шаблон класса any_iterator является аналогом boost :: function для итераторов.Он позволяет вам иметь одну переменную и назначать ей итераторы разных типов, если эти итераторы имеют подходящую общность.

...