Pergunta

Estou tentando encontrar uma maneira genérica de acessar um conjunto de contêineres.Eu tenho um vetor e uma lista padrão, além de outra lista personalizada.

A lista personalizada define um iterador;

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

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

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

com os operadores apropriados sobrecarregados.

Idealmente, eu gostaria de fazer isso;

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;
};

Mas obviamente estes são todos iteradores de tipos diferentes.Posso assumir que todos os contêineres são do mesmo tipo.

Existe uma maneira elegante de resolver esse problema?

Foi útil?

Solução

Outras dicas

Antes tarde do que nunca...

A última edição da C-Vu apareceu e adivinhe o que havia nele:Isso mesmo, iteradores que fazem exatamente o que você queria.

Infelizmente você precisa se tornar um membro do ACCU para ver a revista (o artigo faz referência ao artigo Overload de 2000 ao qual David tem um link).Mas por um preço mísero por ano você consegue uma boa revista para ler, conferências e grupos de usuários.Quando você se torna um membro, você pode visualizar PDFs das edições anteriores para o que você está esperando?

Um caso de ter cuidado com o que você pede.As classes any_iterator que você vê funcionam em um conjunto ilimitado de tipos de iteradores.Você só tem três, que você conhece de antemão.Claro, talvez você precise adicionar um quarto tipo no futuro, mas e se isso exigir O(1) linhas extras de código?

A grande vantagem de um conjunto fechado de possíveis tipos contidos é que você tem um limite superior em sizeof(), o que significa que você pode evitar o heap e a indireção que ele traz.Basicamente, coloque todos eles em boost::variant e chame apply_visitor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top