Pregunta

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

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 adecuados 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 todos estos son iteradores de diferentes tipos.Sin embargo, puedo asumir que todos los contenedores son del mismo tipo.

¿Existe una manera elegante de resolver este problema?

¿Fue útil?

Solución

Otros consejos

Mejor tarde que nunca...

El último número de C-Vu Aparecí y adiviné qué había en él:Así es, iteradores que hacen exactamente que querías.

Desafortunadamente necesitas convertirte en miembro de la ACCU para ver la revista (el artículo hace referencia al artículo Overload del año 2000 al que enlaza David).Pero por un precio mísero al año obtienes una bonita revista para leer, conferencias y grupos de usuarios.Cuando se convierta en miembro, podrá ver los PDF de los números anteriores para que Que estas esperando?

Un caso de tener cuidado con lo que pides.Las clases any_iterator que ves funcionan en un conjunto ilimitado de tipos de iteradores.Sólo tienes tres, que ya sabes desde el principio.Claro, es posible que necesites agregar un cuarto tipo en el futuro, pero ¿y qué pasa si eso requiere O(1) líneas adicionales de código?

La gran ventaja de un conjunto cerrado de posibles tipos contenidos es que tiene un límite superior en sizeof(), lo que significa que puede evitar el montón y la dirección indirecta que conlleva.Básicamente, colóquelos todos en una variante boost:: y llame a apply_visitor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top