Switch mit Stringausdruck nicht möglich?



  • Kann ich irgendwie ( außer if-Schachtelung ) einen String als Parameter für Switch nehmen? Mein MSVC++ 6.0 (SP4) Compiler meint es wäre illegal. 😉



  • Nein kannst du nicht, switch dient nur zum prüfen von Integer-Konstanten. Das Konstrukt ist eh ziemlich veraltet. Eine schöne neue Variante, mit Objekt Support wär toll.

    Eine Möglichkeit ohne if-Schachtelung wäre zB.

    std::string str1,str2;
    //strings füllen
     (str1=="hallo" && foo()) || (str2=="welt" && bar());
    

    ist aber nicht so schön zu lesen 🙂

    btw. ein Thread reicht, nicht 6 🙂



  • unfug. foo gibt doch nicht konstant true zurück.

    manche jagen den string erst duch ne hashtable, um switchen zu können.
    switch darf keinen objektblabla kriegen, denn switch ist keine schreibvereinfachung zu if/else, sondern ne spruntabelle. das ist ein ganz anderes konzept.



  • unfug. foo gibt doch nicht konstant true zurück.

    dafür gibt es doch den alten Komma Operator 🙂

    (str1=="hallo" && (foo(),true)) || (str2=="hallo" && (bar(),true));
    

    (der Code ist ja auch nicht so ernst gemeint, niemand sollte so coden, da es nicht gerade leserlich ist. if()else ist da leserlicher 🙂

    Und das mit der Sprungtabelle ist vielleicht für Embedded Systeme interessant, aber mittlerweile läuft ein switch nicht langsammer als ein if ab. Zumindest waren die letzten Messungen die ich irgend wann mal da gemacht habe so.



  • ODer wenn du die Vorgaben kennst...

    string sList[4]={"str1","str2","str3","str4"};
    int pos;
    for(pos=0;pos<4 && sListe[i]!=str;++pos);
    switch(pos)
    {
      case 0: //String1
      break;
      case 1: //String2
      break;
      case 2: //String3
      break;
      case 3: //String4
      break;
      default: //Kein String
    }
    


  • Windoof schrieb:

    ODer wenn du die Vorgaben kennst...

    dann kann man auch stets ne hashfunktion schreiben, die die strings auf den bereich 0 bis anzahl-1 abbildet.

    string sList[4]={"str1","str2","str3","str4"};
    
    int hash_sList(string s){
       return s[3]-1;
    }
    
    for(pos=0;pos<4 && sListe[i]!=str;++pos);
    

    statt liste schug ich halt hashtable vor, weil die nicht langsamer wird, wen mehr daten kommen.



  • map<string,int> stringmap;
    switch(stringmap["mystring"]))
    

    Devil



  • Jaaa... geht's noch kürzer und einfacher? *löl* OK, das kannte ich bisher noch nicht. Man lenrt aber auch immer wieder etwas neues...



  • Ich habs nun in der Zwischenzeit doch als if-else-Baum gelöst.
    Trotzdem danke für die Posts. Vielleicht werde ich zu einem späteren Zeitpunkt darauf eingehen.

    @Mods: Bitte die anderen Threads löschen. Es gab zu dem Zeitpunkt irgendwie ein Forumproblem. 😉



  • kingruedi schrieb:

    Nein kannst du nicht, switch dient nur zum prüfen von Integer-Konstanten. Das Konstrukt ist eh ziemlich veraltet. Eine schöne neue Variante, mit Objekt Support wär toll.

    Das stelle ich mir ziemlich schwierig vor, sofern du nicht jedem Objekt ne Hashfunktion mitgeben willst, die gleiche Hashes ausspuckt, wenn die geg. compare-Funktion die Objekte für gleich erklärt - switch ist ja kein Synonym für ne if-else-Kettenkonstruktion.

    Ansonsten hat devil81s Konstruktion den Nachteil, dass der []-Operator ggf. neue Elemente anlegt, so dass stringmap["mystring"] für unbekannte Strings 0 gibt. Besser wäre

    switch(stringmap.find(my_string)->second) {
      //...
    }
    


  • 0xdeadbeef schrieb:

    kingruedi schrieb:

    Nein kannst du nicht, switch dient nur zum prüfen von Integer-Konstanten. Das Konstrukt ist eh ziemlich veraltet. Eine schöne neue Variante, mit Objekt Support wär toll.

    Das stelle ich mir ziemlich schwierig vor, sofern du nicht jedem Objekt ne Hashfunktion mitgeben willst, die gleiche Hashes ausspuckt, wenn die geg. compare-Funktion die Objekte für gleich erklärt - switch ist ja kein Synonym für ne if-else-Kettenkonstruktion.

    Nein, ich glaube er meint das mehr aus syntaktischer Sicht. Also quasi ein switch, welches bei nicht-builtins kein wirkliches ist, aber so aussieht.



  • Kann man das nicht auch über die Adressen der Strings im Array machen, die sind doch praktisch ints oder jedenfalls als solche zu sehen. 🙄



  • Mis2com schrieb:

    Kann man das nicht auch über die Adressen der Strings im Array machen, die sind doch praktisch ints oder jedenfalls als solche zu sehen. 🙄

    Die Adressen werden zur laufzeit vergeben, wie willst du
    da einen Switch drauf bauen ?

    Devil



  • Hab gelesen, dass switch bei C# auch auf Strings anwendbar ist. Schade, dass das bei C++ net geht.



  • Waermeleitpaste schrieb:

    Hab gelesen, dass switch bei C# auch auf Strings anwendbar ist

    Japp.


Anmelden zum Antworten