Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Cekap untuk Nilai Bukan Integer dalam C/C?

Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Cekap untuk Nilai Bukan Integer dalam C/C?

Linda Hamilton
Linda Hamiltonasal
2024-12-04 09:08:15195semak imbas

How Can I Efficiently Implement a Switch Statement for Non-Integer Values in 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 &amp;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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn