Template "Datenbank"



  • Hallo,
    ich würde gerne eine ganz simple Datenbank via Templates bauen.
    Etwa:

    template <class Key,class Value>
    class Datenbank
    {
     std::multimap<Key,Value> daten;
     std::vector<Value> tell(Key k)
    {
    return (values of key k)
    }
    };
    

    Eigentlich nur ne gewrappte map.
    Nun würde ich aber gerne noch eine Funktion zum Laden der Daten (aus einer Datei) anbieten.
    Wie würde man das sinnvoll für so eine Templateklasse durchführen?



  • Vielleicht ein Schnellschuss...

    template< typename Key, typename Value >
    void read_database( std::istream& stream, database<Key,Value>& db )
    {
       ...
       {
           Key key;
           Value value;
    
           stream >> key >> value; ...
           db.put( key, value );
       }
    }
    


  • Danke für deine Antwort.
    Dann müsste man natürlich noch definieren wie ein einzelner Key ausgelesen wird.
    Das ist eigentlich der Kern meiner Frage, wie man das am elegantesten löst, so dass man als user möglichst wenig selbst ergänzen muss.



  • Vielleicht ein Schnellschuss...

    istream& operator>>( istream& stream, MyType1& dest );
    istream& operator>>( istream& stream, MyType2& dest );
    istream& operator>>( istream& stream, MyType3& dest );
    istream& operator>>( istream& stream, MyType4& dest );
    istream& operator>>( istream& stream, MyType5& dest );
    istream& operator>>( istream& stream, MyType6& dest );
    istream& operator>>( istream& stream, MyType7& dest );
    


  • Danke erneut 🙂

    Daran hatte ich auch gedacht, aber was, wenn z.B. ein Typ Binärdaten benötigt ein anderer aber sinnvoller via textstreams funktioniert. Denkbar wäre auch, das ein Typ vllt noskipws als modi möchte ein anderer nicht.
    Dafür gibt es afaik ja keine spezialisierung des istreams 😕
    hmm, das muss doch irgendwie kompakter gehen 😃



  • Naja, bevor ich jetzt ein eierlegendes Wollmilchsau-Frontend für eine multimap-Datenbank schreibe, würde ich dann doch lieber eine echte DB verwenden...
    Ansonsten gilt: von nix kommt nicht, es gibt erstmal die N Datentypen und dann die N+M Persistenz-Repräsentationen derer. Wenn es von einem mehrere gibt, dann müssen diese mehrere eben implementiert werden.
    Du könntest jetzt irgendwie eine Schnittstelle pair_provider<Key,Value> definieren, die einfach Key,Value-Paare ausspuckt... Das könnte man dann für istream schonmal vorimplementieren und der Benutzer kann sich immernoch einen anderen Daten-Provider implementieren. Oder irgendein supergeiler iterator-Ansatz... aber ob sich der Aufwand lohnt? Ich weiß ja nicht!


Anmelden zum Antworten