У меня есть C++ перечисление кодов ошибок (30 из них), и есть функция, которая возвращает код ошибки в случае возникновения проблемы. Есть ли способ проанализировать перечисление, чтобы проверить, какой из кодов ошибок был возвращен, и предоставить интерпретацию? Я знаю, что оператор switch может быть вариантом здесь, но искал что-то другое, чтобы избежать написания множества операторов switch.Как я могу проанализировать перечисление в C++?
ответ
Нет, это невозможно: имена констант перечисления являются артефактами времени компиляции, они недоступны во время выполнения *.
Вы можете сделать map<string,MyEnumType>
и заполнить его именами перечислений и их значениями. Вы можете использовать «stringize макросы», чтобы не вводить и то же значение несколько раз:
#include <iostream>
#include <string>
#include <map>
using namespace std;
#define ADD_ENUM_TO_MAP(m,x) m[#x]=x
enum MyEnumType {
quick, brown, fox, jumps, over, the, lazy, dog
};
int main() {
map<string,MyEnumType> nameToEnum;
ADD_ENUM_TO_MAP(nameToEnum, quick);
ADD_ENUM_TO_MAP(nameToEnum, brown);
ADD_ENUM_TO_MAP(nameToEnum, fox);
ADD_ENUM_TO_MAP(nameToEnum, jumps);
ADD_ENUM_TO_MAP(nameToEnum, over);
ADD_ENUM_TO_MAP(nameToEnum, the);
ADD_ENUM_TO_MAP(nameToEnum, lazy);
ADD_ENUM_TO_MAP(nameToEnum, dog);
cout << nameToEnum["fox"] << endl;
return 0;
}
* Debuggers получить эту информацию через таблицу символов, представленной компилятором.
Что вы можете сделать, это предоставление карты (как я уже говорил в мой комментарий):
enum ErrorCodes {
OK ,
ERR_FILE_OPEN ,
ERR_MISSING_INPUT ,
// ...
}
std::map<ErrorCodes,std::string> codeTranslationMap {
{ OK, "OK" }
{ ERR_FILE_OPEN , "File open failed." }
{ ERR_MISSING_INPUT , "Missing input." }
// ...
};
В дополнение dashblinkenlight's answer, вы могли бы играть X-macro C & C++ preprocessor трюки, как:
// your list of enumerators applied to a preprocessor macro:
#define ENUM_LIST(P) \
P(ERR_NONE,"no errors") \
P(ERR_FILE_OPEN,"file open") \
P(MISSING_INPUT,"missing input")
, то вы должны сначала определить перечисление, используя:
#define ENUM_DEFINE(Nam,Str) Nam,
enum error_en {
ENUM_LIST(ENUM_DEFINE)
};
#undef ENUM_DEFINE
, а затем определить печать, например. с
void out(enum error_en e) {
switch(e) {
#define ENUM_OUT(Nam,Str) case Nam: cout << Str; break;
ENUM_LIST(ENUM_OUT)
#undef ENUM_OUT
} // end switch
}
Или вы можете играть аналогичные трюки, чтобы обеспечить эквивалент πάντα ῥεῖ 's answer
this answer См также о творческом использовании нескольких #include
-s одного и тот же файла.
- 1. Как я могу перебирать перечисление?
- 2. Как я могу проанализировать XML-файл в Objective C
- 3. Как я могу проанализировать такое исключение?
- 4. Могу ли я использовать перечисление как свойство в Objective C
- 5. Как я могу подтвердить перечисление в FluentValidator C#
- 6. Как я могу проанализировать содержимое введенного URL?
- 7. Как я могу в целом перечислить перечисление?
- 8. Как я могу проанализировать XML-файл Axis?
- 9. Как я могу проанализировать следующий текстовый файл?
- 10. Как я могу проанализировать файл заголовка C с помощью Perl?
- 11. Как я могу проанализировать аргументы командной строки?
- 12. Как я могу проанализировать параметры функции?
- 13. Как я могу проанализировать выполнение запроса Sqlite?
- 14. Как я могу проанализировать XML-файл
- 15. Как я могу проанализировать строку словаря?
- 16. Как я могу проанализировать этот HTML-файл?
- 17. Как я могу проанализировать этот xml?
- 18. Как я могу проанализировать число, эквивалентное DateTime.TryParseExact?
- 19. Как я могу проанализировать следующую строку
- 20. Как я могу проанализировать мой новый проект?
- 21. Как я могу проанализировать следующий массив?
- 22. C# - Как я могу вернуть перечисление вместо хранимой ценности перечислений?
- 23. Могу ли я добавлять методы в перечисление Objective-C?
- 24. Как я могу проанализировать строку [] в int [] в java?
- 25. Как я могу проанализировать вектор разных единиц в миллисекундах?
- 26. Я не могу понять, как перечисление работает в
- 27. C-как перечисление в Java
- 28. Как я могу сделать «абстрактное» перечисление в библиотеке классов .NET?
- 29. Как я могу проанализировать результат запроса в строке в postgres?
- 30. Как я могу проанализировать строку в формате strftime в Perl?
Преобразование перечислений в текст и текст в перечисления является одним из немногих законных применений макросов препроцессора. –
Единственное решение, о котором я знаю, это создать карту, содержащую значения перечисления в виде ключей и соответствующие строковые представления как значения. –