Maison >développement back-end >C++ >Comment puis-je implémenter efficacement une instruction Switch pour les valeurs non entières en C/C ?
Activer les valeurs non entières en C/C
Problème :
Détermination des actions basé sur des éléments constants non POD (par exemple, des chaînes) nécessite des solutions de contournement telles que des ifs imbriqués, qui peuvent être inefficace et complexe. L'instruction switch, conçue pour les valeurs entières, ne prend pas directement en charge les valeurs non entières.
Solution 1 : Macro et Template Magic (fastmatch.h)
Utilisation de macros et modèles, on peut créer une recherche binaire déroulée au moment de la compilation. La syntaxe est concise, mais nécessite des branches de cas triées. Cette approche génère une fonction avec des ruptures implicites qui attribue la correspondance pertinente à un tampon.
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);
Solution 2 : C 11 Lambdas et listes d'initialisation
En C 11 , les lambdas et les listes d'initialisation fournissent une solution plus propre. Cette approche effectue une recherche binaire sur une liste de paires clé-valeur, où la clé correspond à la valeur non entière et la valeur est un pointeur de fonction. La fonction trouvée est ensuite invoquée.
#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;});
Solution 3 : Compile Time Trie (cttrie)
En C 11, une approche de compilation au moment de la compilation peut gérer les fichiers non triés le cas se branche sans effort. Les techniques avancées de métaprogrammation génèrent un recherche-trie au moment de la compilation, en utilisant des instructions switch dans chaque nœud de trie pour rediriger efficacement le flux d'exécution.
L'implémentation complète est disponible sur github : smileingthax/cttrie.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!