29 votes

Itérateur générique

Je suis en train d'essayer de trouver un moyen générique de l'accès à un ensemble de conteneurs. J'ai une norme du vecteur et de la 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 surchargés.

Idéalement, je voudrais pour ce faire;

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 les itérateurs de différents types. Je peux supposer que tous les contenants sont du même type, cependant.

Est-il un moyen élégant pour résoudre ce problème?

19voto

David Sykes Points 9683

1voto

graham.reeds Points 9363

Mieux vaut tard que jamais...

Le dernier numéro de C-Vu tourné et suppose que ce qui était en elle: C'est vrai, les itérateurs que faire exactement ce que tu voulais.

Malheureusement vous avez besoin pour devenir un membre de l' ACCU pour afficher le magazine (l'article fait référence à la Surcharge de l'article à partir de 2000 que David liens). Mais pour un maigre prix à un an, vous obtenez un joli magazine à lire, des conférences et des groupes d'utilisateurs. Lorsque vous devenez membre, vous pouvez visualiser les fichiers PDF de l'arrière des questions alors qu'attendez-vous pour?

1voto

Mark Points 251

Fondamentalement, oui.

Je lis une tonne de données dans un conteneur qui n'est pas déterminé avant l'exécution. Plutôt que d'avoir trois itérateurs qui seront utilisés à l'identique (dans une boucle simple), je cherchais un moyen de déclarer un itérateur générique en quelque sorte.

1voto

MSalters Points 74024

Une affaire en faisant attention à ce que vous demandez. Le any_iterator classes de vous voir travailler sur un ensemble illimité de types iterator. Vous n'avez que trois, dont vous savez qu'à l'avant. Bien sûr, vous pourriez avoir besoin d'ajouter un quatrième type dans le futur, mais tant pis si cela prend O(1) lignes de code supplémentaires ?

Le gros avantage d'un ensemble fermé de possibles contenues types, c'est que vous avez une limite supérieure sur sizeof(), ce qui signifie que vous pouvez éviter le tas et l'indirection qu'il apporte. Fondamentalement, les farcir le tout dans un boost::variant et l'appel apply_visitor.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X