C/C: Switch-Anweisungen für nicht-ganzzahlige Werte
In Switch-Anweisungen ist es oft notwendig, Aktionen basierend auf nicht-ganzzahligen Werten auszuführen. ganzzahlige Werte. Leider können Switch-Anweisungen in C/C nur mit ganzzahligen Ausdrücken verwendet werden.
Der unkomplizierte Ansatz
Eine einfache Lösung für den Umgang mit nicht ganzzahligen Switch-Anweisungen ist Verwenden Sie eine Reihe von if-else-Anweisungen:
if (str == "foo") { ... } else if (str == "bar") { ... } else { ... }
Dieser Ansatz ist jedoch ausführlich und ineffizient (O(n), wobei n der ist Anzahl der Fälle) und es fehlt die Eleganz einer Switch-Anweisung.
Makro- und Vorlagentricks
Mithilfe von Makros und Vorlagen ist es möglich, die binäre Suche beim Kompilieren zu implementieren Zeit:
#define NEWMATCH MATCH("asd") some c++ code MATCH("bqr") ... the buffer for the match is in _buf MATCH("zzz") ... user.YOURSTUFF /*ELSE optional */ ENDMATCH(xy_match)
Dadurch wird eine Funktion xy_match generiert, die automatisch eine binäre Suche durchführt und für jeden Fall den entsprechenden Code aufruft. Dieser Ansatz ist effizient (O(log n)), aber nicht so einfach wie eine Standard-Switch-Anweisung.
C 11-Verbesserungen
C 11 führte Lambdas ein und Initialisierungslisten, die die Klarheit nicht ganzzahliger Switch-Anweisungen erheblich verbessern:
template <typename KeyType, typename FunPtrType, typename Comp> void Switch(const KeyType &value,std::initializer_list<std::pair<const KeyType,FunPtrType>> sws,Comp comp) { auto r=std::lower_bound(sws.begin(),sws.end(),val,cmp); if ( (r!=sws.end())&&(!cmp(val,*r)) ) { r->second(); } }
Diese Vorlage bietet eine prägnante und effiziente Möglichkeit zur Implementierung nicht ganzzahlige Switch-Anweisungen.
Kompilierungszeitversuch
Ein neuerer Fortschritt besteht darin, Metaprogrammierung zu verwenden, um einen Suchversuch zur Kompilierungszeit zu generieren. Dieser Ansatz verarbeitet unsortierte nicht-ganzzahlige Switch-Anweisungen und generiert mithilfe des Codegenerators des Compilers effizienten Code:
Switch<const char *,void (*)()>("ger",{ // sorted: {"asdf",[]{ printf("0\n"); }}, {"bde",[]{ printf("1\n"); }}, {"ger",[]{ printf("2\n"); }} },[](const char *a,const char *b){ return strcmp(a,b)<0;});
Dieser Ansatz verbessert die Effizienz und Lesbarkeit nicht-ganzzahliger Switch-Anweisungen in C/C weiter.
Das obige ist der detaillierte Inhalt vonWie kann ich Switch-Anweisungen mit nicht ganzzahligen Werten in C/C implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!