Wie caste ich ein Value aus einer Map?



  • Hi,

    ich habe mir eine Map erstellt und die auch mit Werten gefüllt. Nun möchte ich die Werte der Map in verschiedene Variablen speichern und muss deshalb die Werte in die verschiedenen Variablentypen umwandeln. Leider bekomm ich das nicht ganz auf die Reihe. Mein Problem kurz als Code zusammengefasst:

    map< string, string> test;
    
    test.insert( pair< string, string>( "TestEins", "Hallo"));
    test.insert( pair< string, string>( "TestZwei", "500"));
    test.insert( pair< string, string>( "TestDrei", "3,14"));
    test.insert( pair< string, string>( "TestVier", "true"));
    
    string test1 = test["TestEins"];
    int test2 = test["TestZwei"];
    float test3 = test["TestDrei"];
    bool test4 = test["TestVier"];
    

    Hoffe das verdeutlicht mein Problem. Wie caste ich die Werte der Map damit ich die in die Variablen schreiben kann? Meine einzige Idee wäre über Stringstreams zu casten, aber hoffe dass das doch noch kürzer geht? Weil vor jeder Zeile mittels Stringstream zu kasten würde einen Code sicher auch schnell unübersichtlich werden lassen?

    Da meine Map unterschiedliche Formate als Wert aufnehmen muss kann ich mich ja leider nicht vorher auf z.B. Int festlegen oder so. Daher habe ich die Werte der Map erstmal als String gesetzt da ich denke das mir so keine Informationen verloren gehen können?

    Gruß Daniel


  • Administrator

    Einmal FAQ:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html

    Du kannst so ein Cast auch in eine Funktion auslagern. Dann sieht es wie ein normaler C++ Cast aus. Ganz einfach zum Beispiel so:

    template<T>
    T slow_unchecked_cast(std::string const& str)
    {
      T val;
      std::stringstream ss;
    
      ss << str;
      ss >> val;
    
      return val;
    }
    

    Boost bietet da bereits fertige und bessere Möglichkeiten an:
    http://www.boost.org/doc/libs/1_43_0/libs/conversion/lexical_cast.htm

    Grüssli



  • Dravere schrieb:

    Du kannst so ein Cast auch in eine Funktion auslagern. Dann sieht es wie ein normaler C++ Cast aus. Ganz einfach zum Beispiel so:

    Also wohl tatsächlich mittels Stringstream... Hätte ja auch einfach mal klappen können mit irgendwas vorgefertigtem... 😉

    Danke 🙂



  • insanity schrieb:

    Also wohl tatsächlich mittels Stringstream... Hätte ja auch einfach mal klappen können mit irgendwas vorgefertigtem... 😉

    Dravere hat ja einen Link für etwas vorgefertigtes gepostet. In boost gibt es das. 😉



  • drakon schrieb:

    Dravere hat ja einen Link für etwas vorgefertigtes gepostet. In boost gibt es das. 😉

    Naja, ich meinte mehr etwas was es schon in C++ gibt... 😉 Aber zum lernen (bin ja noch neu) ist es sicher nicht schlecht wenn man das mal händisch macht... 😃 😞



  • Jap. Im übrigen macht boost das ziemlich ähnlich.


  • Administrator

    drakon schrieb:

    Jap. Im übrigen macht boost das ziemlich ähnlich.

    Du hast wohl letztens den Thread nicht genauer (zu ende) gelesen?
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-266622.html

    Bzw. der letzte Beitrag:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1896586.html#1896586
    (letzter Abschnitt)

    Boost macht es eben überhaupt nicht über die IO-Streams von C++. Es ist sogar ziemlich kompliziert, wie sie es umsetzen, dafür um einiges effizienter.

    Grüssli



  • Dravere schrieb:

    Boost macht es eben überhaupt nicht über die IO-Streams von C++. Es ist sogar ziemlich kompliziert, wie sie es umsetzen, dafür um einiges effizienter.

    Aber nur für Standardtypen. Ansonstne machen sie es halt ähnlich.



  • Hab mir den Code ehrlich gesagt nie so exakt angeschaut. Habe da nur gesehen, dass sie mit Streams arbeiten und daraus geschlossen, dass es zumindest ähnlich sein wird.

    Den Beitrag da habe ich gar nicht gelesen. Hab das anscheinend nicht mehr verfolgt gehabt.


Anmelden zum Antworten