C/C : Pernyataan Suis untuk Nilai Bukan Integral
Dalam pernyataan suis, selalunya perlu melakukan tindakan berdasarkan bukan- nilai integer. Malangnya, dalam C/C , penyataan suis hanya boleh digunakan dengan ungkapan integer.
Pendekatan Lurus
Penyelesaian mudah untuk mengendalikan penyataan suis bukan bersepadu ialah dengan gunakan satu siri pernyataan if-else:
if (str == "foo") { ... } else if (str == "bar") { ... } else { ... }
Walau bagaimanapun, pendekatan ini adalah verbose, tidak cekap (O(n), dengan n ialah bilangan kes) dan tidak mempunyai keanggunan pernyataan suis.
Helah Makro dan Templat
Menggunakan makro dan templat, adalah mungkin untuk melaksanakan carian binari pada masa penyusunan:
#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)
Ini menjana fungsi xy_match yang berfungsi secara automatik carian binari dan menggunakan kod yang sesuai untuk setiap kes. Pendekatan ini cekap (O(log n)), tetapi ia tidak semudah pernyataan suis standard.
C 11 Enhancements
C 11 memperkenalkan lambdas dan senarai pemula, yang sangat meningkatkan kejelasan penyataan suis bukan integer:
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(); } }
Templat ini menyediakan cara ringkas dan cekap untuk melaksanakan penyataan suis bukan integer.
Kompilasi Percubaan Masa
Kemajuan yang lebih terkini melibatkan penggunaan pengaturcaraan meta untuk menjana percubaan carian pada masa penyusunan. Pendekatan ini mengendalikan penyataan suis bukan bersepadu yang tidak diisih dan menjana kod yang cekap menggunakan penjana kod pengkompil:
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;});
Pendekatan ini meningkatkan lagi kecekapan dan kebolehbacaan penyataan suis bukan integer dalam C/C .
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Nilai Bukan Integer dalam C/C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!