2012-04-27 16 views
9

Sto provando a creare un iteratore che può solo riferirsi a tipi di valori reali, non a riferimenti. E 'possibile utilizzare boost::iterator_facade o mi richiede di avere valori che possono essere restituiti da indirizzo \ riferimento.boost iteratore facciata e dereferenziazione()

per essere più specfic, il mio iteratore restituisce un std::pair di riferimenti, il che significa che i miei iteratori value_type non viene memorizzata da nessuna parte, ma create al volo su dereferenziazione (come std::map::iterator).

risposta

14

Sì, la cosa che vuoi è possibile. Si prega, dare un'occhiata a boost/iterator_facade.hpp (esempio è per Boost lib della versione 1.49.0, ma è ok per le sue nuove distribuzioni anche):

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

argomento Template Reference è la chiave. Dovresti solo specificare Reference quando deriva da boost::iterator_facade. Ad esempio, il tuo codice può essere il seguente:

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

Grazie per questa risposta, mi ha davvero aiutato. Ho una domanda però, prima di specificare l'argomento del template di riferimento, ho appena provato a restituire il valore. Questo ha compilato, ma mi ha dato risultati molto strani, come i puntatori nella mia classe che diventano nulli in tempi strani. Suppongo che la mia domanda sia, perché è stata compilata? – FlamFace