2012-04-27 8 views
9

Estoy intentando crear un iterador que solo puede desreferenciar a tipos de valores reales, no a referencias. Esto es posible usando boost::iterator_facade, o me requiere tener valores que pueden ser devueltos por dirección \ referencia.boost iterator facade y la función dereference()

Para ser más specfic, mi iterador devuelve un std::pair de referencias, lo que significa que mis iteradores value_type no se almacena en cualquier lugar, pero crean sobre la marcha en la eliminación de referencias (como std::map::iterator).

Respuesta

14

Sí, lo que desea es posible. Por favor, eche un vistazo a boost/iterator_facade.hpp (ejemplo es para lib Boost de la versión 1.49.0, pero está bien para sus nuevas distribuciones también):

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

argumento Plantilla Reference es la clave. Solo debe especificar Reference al derivar de boost::iterator_facade. Por ejemplo, su código puede verse como el siguiente:

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

Gracias por esta respuesta, realmente me ayudó. Tengo una pregunta, sin embargo, antes de especificar el argumento de la plantilla de referencia, intenté devolver el valor. Esto compilado pero me dio resultados muy extraños, como punteros en mi clase que se vuelven nulos en tiempos extraños. Supongo que mi pregunta es, ¿por qué compiló? – FlamFace

Cuestiones relacionadas