Wie schreibt man eine switch-Anweisung für Streicher, die in Qt?
Ich brauchen, um das äquivalent einer switch/case-Anweisung für Streicher in C++ mit Qt. Ich glaube, dass ist der einfachste Weg so etwas (pseudo code)
enum colours { red, green, blue };
QString array[] colour_names = { "red", "green", "blue" };
switch (color_names[user_string]) {
case red: answer="Chose red";
case green: answer="Chose green";
case blue: answer="Chose blue";
other: answer="Invalid choice";
}
Aber diese nicht nutzen, einige der features von Qt. Ich habe gelesen, über QStringList ist (die position des Strings in eine Liste von strings), und std:map (siehe Wie man sich leicht anzeigen c++ enums strings, die ich nicht ganz verstanden).
Gibt es eine bessere Art und Weise zu tun, ein switch auf strings?
- wollen Sie nicht zur Verwendung des enum?
- Sie können strings in einer switch-Anweisung. Sie haben nicht gesagt, warum Sie benötigen einen swicth-Anweisung. Die einfachste Lösung, um eine Suche auf Basis eines Strings ist die Verwendung einer Karte. In Qt, die es bedeuten würde, mit einem QMap<QString,QString>.
- Sollten Sie mit dem llvm::StringSwitch: llvm.org/docs/doxygen/html/StringSwitch_8h_source.html
- Ich fand einen Vorschlag, auf einer anderen Website zu verwenden, eine QStringList von Farben, verwenden Sie IndexOf() in den Schalter, und verwenden Sie dann die enum-Wert in den case-Anweisungen
- Sie können es mit
QMetaEnum
undQMetaObject
wie in meiner Antwort hier
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur so zu verwenden
switch()
mit strings ist die Verwendung eines integer-valued-hash einer Zeichenkette. Sie müssen vorausberechnen hashes der Saiten sind Sie den Vergleich vor. Dies ist der Ansatz, innerhalb von qmake für das Lesen von visual studio Projekt-Dateien, zum Beispiel.Wichtige Vorbehalte:
Wenn Sie sich sorgen über hash-Kollisionen mit anderen Saiten, dann werden Sie brauchen, um vergleichen der Zeichenkette in dem Fall. Dies ist immer noch billiger, als das zu tun (N/2) string-Vergleiche, obwohl.
qHash
wurde überarbeitet für QT 5 und die hashes sind verschiedenen von Qt 4.Vergessen Sie nicht, die
break
- Anweisung in den switch. Dein Beispiel-code fehlte, und hatte auch unsinnig Schalter Wert!Dein code würde wie folgt Aussehen:
Fand ich einen Vorschlag, auf einer anderen Website zu verwenden, eine QStringList von Farben, verwenden Sie IndexOf() in den Schalter, und verwenden Sie dann die enum-Wert in den case-Anweisungen