Я не уверен, что вы действительно хотите использовать iterator_adaptor
в вашем случае - вы можете использовать iterator_facade
вместо.
Более подробное объяснение: iterator_adaptors
используются, когда у вас есть существующий итератор (скажем, std::list<int>::iterator
) и вы хотите повторно использовать его поведение для вашего итератора, например. Ваш итератор будет возвращать в два раза больше значения, указанного в списке, но повторно использовать код обхода из исходного итератора. Или наоборот: вам может понадобиться итератор, который пропустит некоторые элементы в исходном списке, но вернет значения без изменений. Я не уверен, хотите ли вы основывать свой итератор (как в коде повторного использования) на итераторах ваших базовых структур, но, выступая за меня, я бы не стал особенно в случае не разреженного итератора, поскольку вы, вероятно, захотите создать какой-то прокси для ссылки, что означает, что вы не можете использовать какой-либо базовый код итератора dereference()
, и обход, вероятно, прост. Однако вы можете основать sparse_iterator
на каком-то итераторе, который перебирает реально существующие элементы массива, если хотите.
Существуют проблемы с прокси-подходом, поэтому не ожидайте, что он будет работать без нареканий, не пройдя через много циклов. С одной стороны, константная версия не разреженного итератора должна по-прежнему возвращать value_type()
, что означает, что выражения типа iter->foo()
должны переводиться в value_type().foo()
, если соответствующая запись не существует. Но это затрудняет то, что pointer_proxy::operator->()
должен возвращать что-то с operator->
, предпочтительно указателем (определенно не value_type()
). Что приводит к решающему вопросу: указатель на что? Есть возможность решить эту проблему (например, если ваши объекты управляются boost::shared_pointer
, вы можете просто вернуть shared_pointer
экземпляру new
'd).
Для нераздельного итератора необходимо реализовать:
Параметры для шаблона фасада итератора должны быть:
Reference
: reference_proxy
Pointer
: pointer_proxy
Разреженная версия проще: если нижележащий итератор является разумным (т.е. соответствует поведению, которое вы хотите) и правильно реализован, вы можете просто опустить параметры в iterator_adaptor
(кроме первых двух) и взять все реализация.
Проблема "не компилируется": вставка typename
.