Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Cekap untuk Nilai Bukan Integer dalam C/C?
Hidupkan Nilai Bukan Integer dalam C/C
Masalah:
Menentukan tindakan berdasarkan elemen pemalar bukan POD (cth., rentetan) memerlukan penyelesaian seperti nested ifs, yang boleh tidak cekap dan kompleks. Pernyataan suis, direka bentuk untuk nilai integer, tidak menyokong bukan integer secara langsung.
Penyelesaian 1: Makro dan Templat Magic (fastmatch.h)
Menggunakan makro dan templat, seseorang boleh membuat carian binari yang dibuka pada masa penyusunan. Sintaksnya ringkas, tetapi memerlukan cawangan kes yang diisih. Pendekatan ini menjana fungsi dengan pemecahan tersirat yang memperuntukkan padanan yang berkaitan kepada penimbal.
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);
Penyelesaian 2: C 11 Senarai Lambdas dan Initializer
Dalam C 11 , senarai lambdas dan pemula menyediakan penyelesaian yang lebih bersih. Pendekatan ini melakukan carian binari pada senarai pasangan nilai kunci, di mana kunci sepadan dengan nilai bukan integer dan nilainya ialah penunjuk fungsi. Fungsi yang ditemui kemudiannya digunakan.
#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;});
Penyelesaian 3: Compile Time Trie (cttrie)
Dalam C 11, pendekatan compile-time trie boleh mengendalikan unsorted cawangan kes dengan mudah. Teknik metaprogramming lanjutan menjana percubaan carian pada masa penyusunan, menggunakan pernyataan suis dalam setiap nod cubaan untuk mengubah hala aliran pelaksanaan dengan cekap.
Pelaksanaan penuh tersedia di github: smilingthax/cttrie.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Cekap untuk Nilai Bukan Integer dalam C/C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!