Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mencetak Nilai C Enum sebagai Teks Tanpa Menggunakan Pernyataan if/switch?

Bagaimana untuk Mencetak Nilai C Enum sebagai Teks Tanpa Menggunakan Pernyataan if/switch?

Patricia Arquette
Patricia Arquetteasal
2024-11-29 22:55:12610semak imbas

How to Print C   Enum Values as Text Without Using if/switch Statements?

Mencetak Nilai Enum sebagai Teks dalam C Tanpa if/switch

Dalam C , enum menyediakan cara yang mudah untuk mewakili set pemalar bernama. Walau bagaimanapun, apabila mencetak nilai enum, tingkah laku lalai adalah untuk memaparkan perwakilan berangkanya.

Andaikan kita mempunyai enum seperti ini:

enum Errors {
    ErrorA = 0,
    ErrorB,
    ErrorC,
};

Jika kita cuba mencetak nilai enum menggunakan std::cout:

Errors anError = ErrorA;
std::cout << anError; // 0 will be printed

Kami akan mendapat nilai angka 0 dan bukannya perwakilan teks "ErrorA". Isu ini timbul kerana std::cout tidak mempunyai sokongan terbina dalam untuk menukar enum kepada rentetan.

Penyelesaian

1. Menggunakan Peta

Satu pendekatan ialah mencipta peta yang mengaitkan setiap nilai enum dengan perwakilan teksnya:

#include <map>
#include <string_view>

std::ostream& operator<<(std::ostream& out, const Errors value) {
    static const auto strings = [] {
        std::map<Errors, std::string_view> result;
        #define INSERT_ELEMENT(p) result.emplace(p, #p);
        INSERT_ELEMENT(ErrorA);     
        INSERT_ELEMENT(ErrorB);     
        INSERT_ELEMENT(ErrorC);             
        #undef INSERT_ELEMENT
        return result;
    };

    return out << strings[value];
}

2. Menggunakan Tatasusunan Struktur dengan Carian Linear

Pilihan lain ialah menggunakan tatasusunan struktur, setiap satu mengandungi nilai enum dan perwakilan teksnya, dan kemudian lakukan carian linear:

#include <string_view>

std::ostream& operator<<(std::ostream& out, const Errors value) {
#define MAPENTRY(p) {p, #p}
    const struct MapEntry {
        Errors value;
        std::string_view str;
    } entries[] = {
        MAPENTRY(ErrorA),
        MAPENTRY(ErrorB),
        MAPENTRY(ErrorC),
        {ErrorA, 0} //doesn't matter what is used instead of ErrorA here...
    };
#undef MAPENTRY
    const char* s = 0;
    for (const MapEntry* i = entries; i->str; i++) {
        if (i->value == value) {
            s = i->str;
            break;
        }
    }

    return out << s;
}

3. Menggunakan suis/kes

Akhir sekali, kita juga boleh menggunakan pernyataan suis/kes:

#include <string>

std::ostream& operator<<(std::ostream& out, const Errors value) {
    return out << [value] {
    #define PROCESS_VAL(p) case(p): return #p;
        switch(value) {
            PROCESS_VAL(ErrorA);     
            PROCESS_VAL(ErrorB);     
            PROCESS_VAL(ErrorC);
        }
    #undef PROCESS_VAL
    };
}

Menguji Penyelesaian:

Untuk menguji penyelesaian ini, kita boleh mencipta boleh laku menggunakan kod berikut:

#include <iostream>

int main(int argc, char** argv) {
    std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC << std::endl;
    return 0;   
}

Menjalankan ini boleh laku hendaklah mengeluarkan perwakilan teks bagi nilai enum:

ErrorA
ErrorB
ErrorC

Atas ialah kandungan terperinci Bagaimana untuk Mencetak Nilai C Enum sebagai Teks Tanpa Menggunakan Pernyataan if/switch?. 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