>백엔드 개발 >C++ >if/switch 문을 사용하지 않고 C 열거형 값을 텍스트로 인쇄하는 방법은 무엇입니까?

if/switch 문을 사용하지 않고 C 열거형 값을 텍스트로 인쇄하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-29 22:55:12508검색

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

if/switch 없이 C에서 열거형 값을 텍스트로 인쇄하기

C에서 열거형은 명명된 상수 집합을 나타내는 편리한 방법을 제공합니다. 그러나 열거형 값을 인쇄할 때 기본 동작은 숫자 표현을 표시하는 것입니다.

다음과 같은 열거형이 있다고 가정해 보겠습니다.

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

다음을 사용하여 열거형 값을 인쇄하려고 하면 std::cout:

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

텍스트 표현 "ErrorA" 대신 숫자 값 0을 얻습니다. 이 문제는 std::cout에 열거형을 문자열로 변환하는 기본 지원이 부족하기 때문에 발생합니다.

해결책

1. 맵 사용

한 가지 접근 방식은 각 열거형 값을 해당 텍스트 표현과 연결하는 맵을 만드는 것입니다.

#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. 선형 검색과 함께 구조 배열 사용

또 다른 옵션은 각각 열거형 값과 해당 텍스트 표현을 포함하는 구조 배열을 사용한 다음 선형 검색을 수행하는 것입니다.

#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. switch/case 사용

마지막으로 switch/case 문을 사용할 수도 있습니다:

#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
    };
}

솔루션 테스트:

이러한 솔루션을 테스트하기 위해 다음을 사용하여 실행 파일을 만들 수 있습니다. 코드:

#include <iostream>

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

이 실행 파일을 실행하면 열거형 값의 텍스트 표현이 출력됩니다.

ErrorA
ErrorB
ErrorC

위 내용은 if/switch 문을 사용하지 않고 C 열거형 값을 텍스트로 인쇄하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.