Menukar pembolehubah jenis enum kepada rentetan ialah keperluan biasa dalam pengaturcaraan. Sebagai contoh, ia menjadi perlu apabila mencetak nilai enum dalam format yang boleh dibaca atau apabila menghantarnya sebagai parameter kepada fungsi yang mengharapkan hujah rentetan.
Satu pendekatan mudah untuk enum penukaran jenis adalah untuk menulis fungsi manual untuk setiap enum. Contohnya, untuk menukar enum jenis OS:
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]"; } }
Walau bagaimanapun, pendekatan ini terdedah kepada isu penyelenggaraan apabila bilangan enum meningkat.
Pustaka Boost.Preprocessor menyediakan cara yang lebih elegan dan automatik untuk mengendalikan penukaran jenis enum. Ia menggunakan prapemproses untuk menjana fungsi penukaran secara dinamik. Dua makro berikut mencapai matlamat ini:
#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) "]"; \ } \ }
Menggunakan makro ini, enum OS_type boleh ditakrifkan seperti berikut:
DEFINE_ENUM_WITH_STRING_CONVERSIONS(OS_type, (Linux)(Apple)(Windows))
Dalam C , fungsi ToString boleh digunakan untuk menukar nilai enum kepada rentetan:
#include <iostream> int main() { OS_type t = Windows; std::cout << ToString(t) << " " << ToString(Apple) << std::endl; }
Untuk C, fungsi ToString boleh dilaksanakan sebagai makro dan bukannya lebihan fungsi:
#define ToString(t) \ [Unknown ""##t] [Linux "Linux"] [Apple "Apple"] [Windows "Windows"]
Artikel ini telah membentangkan dua kaedah untuk menukar pembolehubah jenis enum kepada rentetan: pendekatan naif menggunakan fungsi manual dan penyelesaian berasaskan prapemproses dengan Boost.Preprocessor. Pendekatan berasaskan prapemproses lebih teguh dan lebih mudah diselenggara, terutamanya apabila berurusan dengan sejumlah besar enum.
Atas ialah kandungan terperinci Bagaimana untuk Menukar Jenis Enum dengan Cekap kepada Rentetan dalam C dan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!