C ++: распечатать значение перечисления в виде текста - PullRequest
73 голосов
/ 27 июля 2010

Если у меня есть такое перечисление

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

Затем я хочу распечатать на консоль

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

, но мне нужен текст "ErrorA", могу ли яэто без использования if / switch?
А какое у вас решение для этого?

Ответы [ 14 ]

1 голос
/ 27 июля 2010

Для этой проблемы я делаю функцию помощи, подобную этой:

const char* name(Id id) {
    struct Entry {
        Id id;
        const char* name;
    };
    static const Entry entries[] = {
        { ErrorA, "ErrorA" },
        { ErrorB, "ErrorB" },
        { 0, 0 }
    }
    for (int it = 0; it < gui::SiCount; ++it) {
        if (entries[it].id == id) {
            return entries[it].name;
        }
    }
   return 0;
}

Линейный поиск обычно более эффективен, чем std::map для небольших коллекций, подобных этой.

0 голосов
/ 16 февраля 2018
0 голосов
/ 27 августа 2016

Используйте препроцессор:

#define VISIT_ERROR(FIRST, MIDDLE, LAST) \
    FIRST(ErrorA) MIDDLE(ErrorB) /* MIDDLE(ErrorB2) */ LAST(ErrorC)

enum Errors
{
    #define ENUMFIRST_ERROR(E)  E=0,
    #define ENUMMIDDLE_ERROR(E) E,
    #define ENUMLAST_ERROR(E)   E
    VISIT_ERROR(ENUMFIRST_ERROR, ENUMMIDDLE_ERROR, ENUMLAST_ERROR)
    // you might undefine the 3 macros defined above
};

std::string toString(Error e)
{
    switch(e)
    {
    #define CASERETURN_ERROR(E)  case E: return #E;
    VISIT_ERROR(CASERETURN_ERROR, CASERETURN_ERROR, CASERETURN_ERROR)
    // you might undefine the above macro.
    // note that this will produce compile-time error for synonyms in enum;
    // handle those, if you have any, in a distinct macro

    default:
        throw my_favourite_exception();
    }
}

Преимущество этого подхода заключается в том, что: - это все еще легко понять, но - допускает различные посещения (не только струны)

Если вы хотите отказаться от первого, создайте себе макрос FOREACH (), затем #define ERROR_VALUES() (ErrorA, ErrorB, ErrorC) и напишите своим посетителям в терминах FOREACH (). Тогда попробуйте пройти проверку кода:).

0 голосов
/ 28 января 2013

Как насчет этого?

    enum class ErrorCodes : int{
          InvalidInput = 0
    };

    std::cout << ((int)error == 0 ? "InvalidInput" : "") << std::endl;

и т. Д. Я знаю, что это очень надуманный пример, но я думаю, что он имеет применение там, где это применимо и необходимо, и, конечно, короче, чем написание сценария для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...