Switch mit Stringausdruck nicht möglich?
-
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.