iterator zurueckgeben, ohne anzugeben was fuer einer



  • Hoi 🙂

    In meiner Klasse gibts einen vector, ich moechte gern eine Methode schreiben, die einen Iterator zuerueckgibt... das Problem: die aufrufende Funktion sollte moeglichst nicht wissen muessen, um was fuer einen Iterator es sich handelt (vector-iterator oder sonstiger Iterator)....

    ehm.... Codebeispiel:

    class foo
    {
       private:
          std::vector<X> bar;
       public:
          std::vector<X>::iterator getIterator() { return bar.begin(); }
    }
    

    ok, bisher hab ich's so geloest:

    void funktion(foo& tmp)
    {
       std::vector<X>::iterator Iterator = tmp.getIterator();
       // ... und jetzt wird der Iterator verwendet
    }
    

    und hier steck ich fest... die Funktion muss selber wissen, dass es sich um einen std::vector<X> - Iterator handelt, und das moecht ich vermeiden (ist IMO auch haesslich)...

    Kann ich das irgendwie bewerkstelligen?

    P. S. ich kenn mich mit Iteratoren im Allgemeinen nicht gut aus, sry wenn die Frage einfach zu loesen war.....



  • Du musst das std::vector auch noch zu einem Templateparameter machen (wie das X).



  • humm???

    kannst du mir bitte ein Beispiel geben? (auch mit der aufrufenden Funktion wenn moeglich 🙂 )



  • Probier mal das:

    template<class C>
    class foo
    {
       private:
          C bar;
       public:
          typedef typename C::iterator iterator;
          iterator getIterator() { return bar.begin(); }
    }
    
    void funktion(foo<std::vector>& tmp)
    {
       foo<std::vector>::iterator Iterator = tmp.getIterator();
       // ... und jetzt wird der Iterator verwendet
    }
    


  • \aleph_0 schrieb:

    Probier mal das:

    [cpp]
    void funktion(foo<std::vector>& tmp)
    {
       foo<std::vector>::iterator Iterator = tmp.getIterator();
       // ... und jetzt wird der Iterator verwendet
    }
    

    genau das wollt ich vermeiden: dass die aufrufende Funktion angeben muss was fuer ein Iterator verwendet wird.... fuehrt wohl kein Weg dran vorbei, oder?



  • Mach einfach:

    class Foo
    {
      //...
      typedef vector<int>::iterator iterator;
    };
    

    Nun verwendet der Foo-Benutzer einfach Foo::iterator, unabhängig davon, was sich dahinter versteckt.


Anmelden zum Antworten