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
Lepaskan: 2024-11-29 22:55:12
asal
629 orang telah melayarinya

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,
};
Salin selepas log masuk

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

Errors anError = ErrorA;
std::cout << anError; // 0 will be printed
Salin selepas log masuk

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];
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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
    };
}
Salin selepas log masuk

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;   
}
Salin selepas log masuk

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

ErrorA
ErrorB
ErrorC
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan