String nach Zahl klappt nicht



  • Habs mit gcc probiert.
    Es klappt.

    #include <iostream>
    #include <sstream>
    
    template <typename T> T fromString(const std::string& str) {
        T value;
        std::istringstream stream(str);
        stream >> value;
        return value;
    }
    int main(){
        std::string str="4711";
        int i=fromString<int>(str);
        std::cout<<i<<'\n';
    }
    


  • Der Operator >> muss für den Typen implementiert sein, damit das klappt.



  • Häßlich, langsam und grausam, aber tut's erstmal erklären, wo der Hase im Pfeffer liegt.

    #include <iostream>
    #include <sstream>
    
    enum Farbe{
        rot=1,
        tot=rot,
        blau=2,
    };
    
    std::istream &operator>>(std::istream& in,Farbe& f){
        std::string name;
        in>>name;
        if(name=="rot")
            f=Farbe::rot;
        else if(name=="tot")
            f=Farbe::tot;
        else if(name=="blau")
            f=Farbe::blau;
        else
            ;//??
        return in;
    }
    
    std::ostream& operator<<(std::ostream& out,Farbe f){
        if(f==Farbe::rot)
            out<<"rot";
        //else...
        return out;
    }
    
    template <typename T> T fromString(const std::string& str) {
        T value;
        std::istringstream stream(str);
        stream >> value;
        return value;
    }
    int main(){
        std::string str="rot";
        Farbe i=fromString<Farbe>(str);
        std::cout<<i<<'\n';
    }
    


  • Ich seh gerade, du schreibst Farbe::rot. Ich schreibe in meinem Code immer nur rot. Ich wusste garnicht, dass das mit EnumTyp::Value geht?!? 😕



  • stringer2 schrieb:

    Ich seh gerade, du schreibst Farbe::rot. Ich schreibe in meinem Code immer nur rot. Ich wusste garnicht, dass das mit EnumTyp::Value geht?!? 😕

    Eine Neuerung von C++0x?
    Ja. http://www2.research.att.com/~bs/C++0xFAQ.html#enum



  • volkard schrieb:

    stringer2 schrieb:

    Ich seh gerade, du schreibst Farbe::rot. Ich schreibe in meinem Code immer nur rot. Ich wusste garnicht, dass das mit EnumTyp::Value geht?!? 😕

    Eine Neuerung von C++0x?
    Ja. http://www2.research.att.com/~bs/C++0xFAQ.html#enum

    Klappt bei mir (VS2010) nicht. enum class Color gibt einen Compiler error und enum Color { ... } Color c = Color::red gibt ein Warning:(



  • stringer2 schrieb:

    Klappt bei mir (VS2010) nicht. enum class Color gibt einen Compiler error und enum Color { ... } Color c = Color::red gibt ein Warning:(

    Mach die doch einfach aus mit

    #pragma warning(disable,4482)
    

    Ich würde aber nochmal eine zweite Meinung einholen, ob das wirklich mit c++0x erlaubt ist.



  • MSVC 2010 beherrscht strongly-typed enums (soweit ich weiß) nur in C++/CLI.



  • volkard schrieb:

    stringer2 schrieb:

    Klappt bei mir (VS2010) nicht. enum class Color gibt einen Compiler error und enum Color { ... } Color c = Color::red gibt ein Warning:(

    Mach die doch einfach aus mit

    #pragma warning(disable,4482)
    

    Ich würde aber nochmal eine zweite Meinung einholen, ob das wirklich mit c++0x erlaubt ist.

    Ne, das is mieser Stil.

    @seldon: Ja, habs auch gerade gelesen. Naja, nicht so tragisch, benutz eh kein C++0x (bietet eh nix wirklich weltbewegendes^^)



  • volkard schrieb:

    stringer2 schrieb:

    Klappt bei mir (VS2010) nicht. enum class Color gibt einen Compiler error und enum Color { ... } Color c = Color::red gibt ein Warning:(

    Mach die doch einfach aus mit

    #pragma warning(disable,4482)
    

    Ich würde aber nochmal eine zweite Meinung einholen, ob das wirklich mit c++0x erlaubt ist.

    http://www2.research.att.com/~bs/C++0xFAQ.html#enum



  • stringer2 schrieb:

    Ne, das is mieser Stil.

    Den Compiler zu reparieren ist oberguter Stil!
    Nur dadurch kann man auf maximaler Warstufe fahren und wird nicht verrückt dabei.
    http://alfps.wordpress.com/2010/05/07/cppx-w4-no-warnings-disabling-msvc-sillywarnings/
    Wobei ich nicht alle davon ausmachen würde, aber die meisten schon.

    Wenn Color::red erlaubt ist für nicht strong typed enums, dann wird in der nächsten Compilerversion die Warnung auch weg sein. Keine Gefahr, sich die Zukunft zu verbauen.



  • Ich liebe auch, wenn ich STL-Container nutze und in meiner DLL exportiere und dann ständig eine Warnung kommt, dass der verwendende Code dann auch die Header nutzt und daher die LIBs braucht und blub... -.- Aber die Warnung ist ja berechtigt, wayned mich halt eben nur an.


Anmelden zum Antworten