2012-04-27 2 views
9

Я пытаюсь создать итератор, который может только разыменовывать реальные типы значений, а не ссылки. Возможно ли это, используя boost::iterator_facade, или он требует, чтобы у меня были значения, которые могут быть возвращены с помощью адреса \ reference.boost итератор фасад и функция разыменования()

Чтобы быть более specfic, мой итератора возвращает std::pair ссылок, а это значит, мои итераторы value_type не хранится, но создается на лету на разыменования (как std::map::iterator).

ответ

14

Да, вещь, которую вы хотите, возможна. Пожалуйста, обратите внимание на boost/iterator_facade.hpp (пример для Boost, Lib версии 1.49.0, но это нормально для своих новых распределений также):

template < 
    class Derived 
    , class Value 
    , class CategoryOrTraversal 
    , class Reference = Value& 
    , class Difference = std::ptrdiff_t 
> 
class iterator_facade 

Шаблон аргумент Reference является ключевым. Вы должны указать только Reference при получении от boost::iterator_facade. Например, ваш код может выглядеть так:

template<typename value_type> 
class custom_iterator 
    : public boost::iterator_facade< 
      custom_iterator<value_type>, 
      value_type, 
      boost::forward_traversal_tag, 
      value_type 
     > 
{ 
    ... 
    value_type dereference() const{ return value_type(...); } 
    ... 
}; 
+0

Благодарим за этот ответ, действительно помогли мне. Однако у меня есть вопрос, прежде чем указывать аргумент шаблона Reference, я просто попытался вернуть значение. Это скомпилировано, но дало мне очень странные результаты, такие как указатели в моем классе, которые стали пустыми в странные времена. Полагаю, мой вопрос в том, почему он вообще скомпилировался? – FlamFace