STL map mit verschiedenen Datentypen (templates)



  • Hi

    Ich evrsuche bereits seit Stunden folgendes zu erreichen. Ich habe in einer Klasse "Datenbank" eine STL map. Diese soll aber unterschiedliche Datentypen abspeichern können (int, bool, string usw)

    class Datenbank
    {
    public:
    
       void setData(string _key, Daten& data)	
       { m_Properties.insert(pair<string, Daten>(_key, data)); }
    
    private:
       map<string, Daten>		m_Properties;
    }
    
    class Daten
    {}
    
    template<class T>
    class RealDaten : public Daten
    {
    public:
    
    	RealDaten()	{ }
    	RealDaten(T _value)	{  m_Value = _value; }
    
    	T m_Value;
    }
    

    Das speichern von Daten über diesen Umweg scheint auch zu gehen. Nur wie bekomme ich die Daten jetzt wieder?

    Wenn ich jetzt zb Daten abfragen will hätte ich mir das so gedacht

    Datenbank* d = new Datenbank()
    // hier sind daten eingefügt worden
    
    RealData<string> data1 = d->getValue<string>("datensatz1");
    

    Die "getValue()" Methode bekomme ich aber nicht hin! folgender Ansatz funktioniert NICHT

    template<typename T>
    WorldStateProperty<T> getValue(string key) 
    {
    return (RealData<T>)m_Properties[key];
    }
    

    Kann mir jemand bei meinen Problem weiterhelfen? Oder wenn es so nciht geht einen anderen Lösungsvorschlag machen. Wichtig ist mir nur dass ich einen STL container habe der verschiedenste Daten abspeichern kann

    PS: bitte keinen Vorschlag mit boost_variant benutzen machen. Ich kann im aktuellen Projekt keine boost libary verwenden!


  • Mod

    Du hast das Problem an deinem Design doch schon selbst erkannt: Du weißt gar nicht, was du bei einem Zugriff wieder herausbekommst. Warum willst du also alles zusammen abspeichern? Was hast du am Ende überhaupt vor? Es wird sicherlich ein besseres Design geben.



  • Mhm ja ich brauche halt eine Datenstrukturen KEY DATEN

    Also genau das was eine Map macht nur dass ich in DATEN die verschiedensten Sachen speichern will (int, String, evtl eine struct usw)

    Welche Möglichkeiten bieten sich für so einen Fall noch an?



  • boost::any, boost::variant



  • 1. mein ich auch, dass da eher grundlegend was falsch gedacht ist.
    2. Wenn es dann doch irgendwie Sinn macht (vielleicht gibst du mal ein sinnvolles Bsp. was Du da speichern willst), kannst du boost::any benutzen bzw. wenn du kein boost verwenden willst/darfst schreib das einfach ab, das ist eine extrem simple Klasse.
    3. Solltest du deine C# (oder Java oder was weiß ich) - Kenntnisse/Angewohnheiten in den entsprechenden Projekten lassen und für ein C++ Projekt erst mal richtig C++ lernen. Das ist nämlich doch ein ganzes Stück anders als andere Sprachen.



  • @brotbernd: Wird halt ein Ansatz für einen Konfigurationsdatei-Wrapper. Ich würde aber gleich object zurückgeben und casten lassen, dann weiß der Developer wenigstens auch, dass dabei etwas schief gehen kann.

    Sekunde, wir sind ja in C++, öhm ja. Also braucht er es vielleicht doch so?

    MfG SideWinder



  • Wenn du sowas trotz der Kritik meiner Vorposter brauchst könntest du sowas machen:

    //verwende deine Datenklassen
    
    std::map< string, Daten* > data_map;
    
    //und dann könntest du an deine Daten kommen per
    RealData< int > &int_data = *dynamic_cast< RealData<int>* >(map["afasdf"]);
    //einfügen:
    map["sdfgjhasd"] = new RealData< double >();
    //statt "std::map< string , Datan* > data_map;"
    //evtl sowas wie "std::map< string , std::unique_ptr< Daten > >;", damit deine Daten auch gelöscht werden, außerdem virtueller Destruktor 
    //in "Daten"
    

Log in to reply