Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menukarkan Nilai C Enum dengan Cekap kepada Perwakilan Rentetannya?

Bagaimanakah Saya Boleh Menukarkan Nilai C Enum dengan Cekap kepada Perwakilan Rentetannya?

Barbara Streisand
Barbara Streisandasal
2024-12-13 01:35:08620semak imbas

How Can I Efficiently Convert C   Enum Values to Their String Representations?

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!

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