Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menukarkan Nilai C Enum dengan Cekap kepada Perwakilan Rentetannya?
Menukar Pembolehubah Jenis Enum kepada Rentetan
Dalam C dan C , jenis enum menyediakan cara yang mudah untuk mewakili set nilai terhingga. Walau bagaimanapun, apabila bekerja dengan printf atau fungsi pemformatan lain, mungkin sukar untuk menukar enum kepada perwakilan rentetan yang sepadan.
Penyelesaian Naif
Penyelesaian mudah melibatkan mencipta penyataan kes suis untuk setiap jenis enum, memetakan setiap nilai kepada rentetan yang sepadan:
enum OS_type { Linux, Apple, Windows }; 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]"; } }
Walau bagaimanapun, ini pendekatan menjadi rumit dan terdedah kepada ralat apabila bilangan nilai enum meningkat.
Menggunakan Boost.Preprocessor
Pustaka Boost.Preprocessor menawarkan penyelesaian yang lebih elegan. Ia membolehkan anda menjana fungsi penukaran sedemikian secara dinamik berdasarkan definisi enum anda:
#include <boost/preprocessor.hpp> #define X_DEFINE_ENUM_WITH_STRING_CONVERSIONS_TOSTRING_CASE(r, data, elem) \ case elem : return BOOST_PP_STRINGIZE(elem); #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) "]"; \ } \ }
Makro pertama (bermula dengan X_) menjana penghitungan dan yang kedua (DEFINE_ENUM_WITH_STRING_CONVERSIONS) menjana fungsi ToString.
Contoh Penggunaan
Untuk penghitungan jenis OS, definisi menggunakan makro ialah:
DEFINE_ENUM_WITH_STRING_CONVERSIONS(OS_type, (Linux)(Apple)(Windows))
Anda kemudiannya boleh menggunakan fungsi ToString untuk menukar nilai enum kepada rentetan:
#include <iostream> int main() { OS_type t = Windows; std::cout << ToString(t) << " " << ToString(Apple) << std::endl; return 0; }
Penyelesaian ini menyediakan pendekatan generik untuk menukar enum kepada rentetan, mengurangkan keperluan untuk berulang penyata kes suis dan menambah baik penyelenggaraan kod.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukarkan Nilai C Enum dengan Cekap kepada Perwakilan Rentetannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!