Domanda

Sto cercando di trovare un modo generico per accedere a una serie di contenitori.Ho un vettore e un elenco standard oltre a un altro elenco personalizzato.

L'elenco personalizzato definisce un iteratore;

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

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

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

con gli operatori appropriati sovraccarichi.

Idealmente, mi piacerebbe farlo;

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

Ma ovviamente questi sono tutti iteratori di diverso tipo.Posso comunque presumere che tutti i contenitori siano dello stesso tipo.

Esiste un modo elegante per risolvere questo problema?

È stato utile?

Altri suggerimenti

Meglio tardi che mai...

L'ultimo numero di C-Vu si presentò e indovina cosa c'era dentro:Esatto, iteratori che lo fanno esattamente cosa volevi.

Sfortunatamente devi diventare un membro del ACCU per visualizzare la rivista (l'articolo fa riferimento all'articolo di Overload del 2000 a cui David si collega).Ma per un misero prezzo all'anno ottieni una bella rivista da leggere, convegni e gruppi di utenti.Quando diventi membro puoi visualizzare i PDF dei numeri arretrati Che cosa stai aspettando?

Un caso di stare attenti a ciò che chiedi.Le classi any_iterator che vedi funzionano su un insieme illimitato di tipi di iteratori.Ne hai solo tre, che conosci in anticipo.Certo, potrebbe essere necessario aggiungere un quarto tipo in futuro, ma cosa succede se ciò richiede O(1) righe di codice extra?

Il grande vantaggio di un insieme chiuso di possibili tipi contenuti è che hai un limite superiore su sizeof(), il che significa che puoi evitare l'heap e il riferimento indiretto che comporta.Fondamentalmente, inseriscili tutti in un boost::variant e chiama apply_visitor.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top