Menukar Pembolehubah Enum kepada Rentetan
Apabila bekerja dengan pembolehubah enum, mungkin terdapat keperluan untuk mencetak perwakilan rentetan yang sepadan dan bukannya nilai integer . Untuk mencapai penukaran ini, beberapa pendekatan tersedia.
Penyelesaian Naif
Satu pendekatan mudah ialah mencipta fungsi yang menukar setiap nilai enum individu kepada rentetan:
enum OS_type { Linux, Apple, Windows }; inline const char* ToString(OS_type v) { switch (v) { case Linux: return "Linux"; case Apple: return "Apple"; case Windows: return "Windows"; default: return "[Unknown OS_type]"; } }
Walaupun kaedah ini mudah, ia menjadi tidak praktikal apabila berurusan dengan sejumlah besar enum nilai.
Penyelesaian Boost.Preprocessor
Untuk mengautomasikan proses penukaran, perpustakaan Boost.Preprocessor boleh digunakan. Penyelesaian ini membolehkan anda mentakrifkan enum dengan penukaran rentetan sekali gus:
#include <boost/preprocessor.hpp> #define DEFINE_ENUM_WITH_STRING_CONVERSIONS(name, enumerators) \ enum name { \ BOOST_PP_SEQ_ENUM(enumerators) \ }; \ \ inline const char* ToString(name v) \ { \ switch (v) \ { \ BOOST_PP_SEQ_FOR_EACH( \ X_DEFINE_ENUM_WITH_STRING_CONVERSIONS_TOSTRING_CASE, \ name, \ enumerators \ ) \ default: return "[Unknown " BOOST_PP_STRINGIZE(name) "]"; \ } \ }
Menggunakan makro ini, enum jenis OS boleh ditakrifkan sebagai:
DEFINE_ENUM_WITH_STRING_CONVERSIONS(OS_type, (Linux)(Apple)(Windows))
Pendekatan ini menyelesaikan penyelenggaraan isu yang berkaitan dengan penyelesaian naif dan secara dinamik menjana fungsi penukaran yang diperlukan.
Lain-lain Pertimbangan
Dalam C , adalah mungkin untuk melaksanakan ToString sebagai operator yang berlebihan, menjadikannya lebih ringkas untuk penggunaan. Selain itu, penyelesaian ini boleh disesuaikan untuk digunakan dalam C juga.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Pembolehubah Enum dengan Cekap kepada Perwakilan Rentetannya dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!