2008-08-13 15 views
29

Estoy tratando de encontrar una forma genérica de acceder a un conjunto de contenedores. Tengo un vector estándar y una lista además de otra lista personalizada.Iterador genérico

La lista personalizada define un iterador;

class Iterator: public std::iterator<std::forward_iterator_tag, T> { 
    // ... 
} 

Iterator begin() { 
    return (Iterator(root)); 
} 

Iterator end() { 
    return (Iterator(NULL)); 
} 

con los operadores apropiados sobrecargados.

Idealmente, me gustaría hacer esto;

class Foo { 
public: 
    Foo() { 
     std::list<int> x; 
     std::vector<int> y; 
     custom_list<int> z; 

     iter = x.begin(); // OR 
     iter = y.begin(); // OR 
     iter = z.begin(); 

     // ... 
    }; 
private: 
    std::iterator<int> iter; 
}; 

Pero obviamente estos son todos los iteradores de diferentes tipos. Sin embargo, puedo suponer que todos los contenedores son del mismo tipo.

¿Hay una forma elegante de resolver este problema?

Respuesta

2

vale tarde que nunca ...

El último número de C-Vu se presentó y adivina qué había en él: así es, iteradores que hace exactamente lo que quería.

Lamentablemente necesita hacerse miembro de la ACCU para ver la revista (el artículo hace referencia al artículo de sobrecarga del 2000 al que David se vincula). Pero por un módico precio al año, obtienes una buena revista para leer, conferencias y grupos de usuarios. Cuando se convierte en miembro, puede ver los PDF de los números atrasados, así que what are you waiting for?

+2

Hubiera sido útil si hubiera mencionado que el artículo se encuentra en vol 20 issue 3 June 08 titulado Iteradores personalizados en C++. buena foto de usuario por cierto. – danio

1

Un caso de tener cuidado con lo que pide. Las clases any_iterator que ves funcionan en un conjunto ilimitado de tipos de iteradores. Solo tienes tres, que sabes por adelantado. Claro, es posible que necesite agregar un cuarto tipo en el futuro, pero ¿y qué si eso toma O (1) líneas adicionales de código?

La gran ventaja de un conjunto cerrado de posibles tipos contenidos es que tienes un límite superior en sizeof(), lo que significa que puedes evitar el montón y la indirección que trae. Básicamente, rellenarlos todos en una variante :: boost y llamar a apply_visitor.