Question

J'essaie de trouver un moyen générique d'accéder à un ensemble de conteneurs.J'ai un vecteur standard et une liste en plus d'une autre liste personnalisée.

La liste personnalisée définit un itérateur ;

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

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

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

avec les opérateurs appropriés surchargés.

Idéalement, j'aimerais faire cela ;

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

Mais évidemment, ce sont tous des itérateurs de types différents.Je peux cependant supposer que tous les conteneurs sont du même type.

Existe-t-il une manière élégante de résoudre ce problème ?

Était-ce utile?

Autres conseils

Mieux vaut tard que jamais...

Le dernier numéro de C-Vu est arrivé et devinez ce qu'il y avait dedans :C'est vrai, les itérateurs qui le font exactement Ce que vous vouliez.

Malheureusement, vous devez devenir membre du ACCU pour voir le magazine (l'article fait référence à l'article Overload de 2000 auquel David renvoie).Mais pour un prix dérisoire par an, vous obtenez un joli magazine à lire, des conférences et des groupes d'utilisateurs.Lorsque vous devenez membre, vous pouvez consulter les PDF des anciens numéros afin Qu'est-ce que tu attends?

Il faut faire attention à ce que vous demandez.Les classes any_iterator que vous voyez fonctionnent sur un ensemble illimité de types d'itérateurs.Vous n’en avez que trois, que vous connaissez d’avance.Bien sûr, vous devrez peut-être ajouter un quatrième type à l'avenir, mais que se passe-t-il si cela prend O(1) lignes de code supplémentaires ?

Le gros avantage d'un ensemble fermé de types contenus possibles est que vous avez une limite supérieure sur sizeof(), ce qui signifie que vous pouvez éviter le tas et l'indirection qu'il entraîne.En gros, mettez-les tous dans un boost::variant et appelez apply_visitor.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top