Nicht-ganzzahlige Werte in C/C einschalten
Problem:
Aktionen bestimmen Basierend auf Nicht-POD-Konstantelementen (z. B. Zeichenfolgen) sind Problemumgehungen wie verschachtelte Ifs erforderlich, die ineffizient und komplex sein können. Die für ganzzahlige Werte konzipierte Switch-Anweisung unterstützt Nicht-Ganzzahlen nicht direkt.
Lösung 1: Makro- und Vorlagenmagie (fastmatch.h)
Verwenden von Makros und Mithilfe von Vorlagen kann man zur Kompilierzeit eine abgerollte binäre Suche erstellen. Die Syntax ist prägnant, erfordert jedoch sortierte Groß-/Kleinschreibungszweige. Dieser Ansatz generiert eine Funktion mit impliziten Unterbrechungen, die die entsprechende Übereinstimmung einem Puffer zuweist.
MATCH("asd") some c++ code MATCH("bqr") ... the buffer for the match is in _buf MATCH("zzz") ... user.YOURSTUFF /*ELSE optional */ ENDMATCH(xy_match) xy_match("bqr",youruserdata);
Lösung 2: C 11 Lambdas und Initialisierungslisten
In C 11 , Lambdas und Initialisierungslisten bieten eine sauberere Lösung. Dieser Ansatz führt eine binäre Suche in einer Liste von Schlüssel-Wert-Paaren durch, wobei der Schlüssel dem nicht ganzzahligen Wert entspricht und der Wert ein Funktionszeiger ist. Die gefundene Funktion wird dann aufgerufen.
#include <utility> #include <algorithm> #include <initializer_list> template <typename KeyType, typename FunPtrType, typename Comp> void Switch(const KeyType &value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws, Comp comp) { // ... search and invoke code } Switch("ger",{ {"asdf",[]{ printf("0\n"); }}, {"bde",[]{ printf("1\n"); }}, {"ger",[]{ printf("2\n"); }} },[](const char *a,const char *b){ return strcmp(a,b)<0;});
Lösung 3: Compile Time Trie (cttrie)
In C 11 kann ein Kompilierungszeit-Trie-Ansatz unsorted verarbeiten Fall verzweigt sich mühelos. Fortgeschrittene Metaprogrammierungstechniken generieren zur Kompilierungszeit einen Suchversuch und nutzen dabei Switch-Anweisungen in jedem Trie-Knoten, um den Ausführungsfluss effizient umzuleiten.
Die vollständige Implementierung ist auf Github verfügbar: smilethax/cttrie.
Das obige ist der detaillierte Inhalt vonWie kann ich eine Switch-Anweisung für nicht ganzzahlige Werte in C/C effizient implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!