tg-me.com/cpp_geek/307
Last Update:
💡 Сегодня покажу вам способ, как удобно логировать enum-значения в C++, не превращая код в кашу из switch
и if
.
📌 Проблема: у вас есть enum, и вы хотите красиво выводить его в лог или std::cout, но стандартно C++ этого не умеет.
Например:
enum class Status {
Ok,
Error,
Timeout
};
Обычно вы пишете:
std::string to_string(Status s) {
switch(s) {
case Status::Ok: return "Ok";
case Status::Error: return "Error";
case Status::Timeout: return "Timeout";
}
return "Unknown";
}
Но есть способ проще и без switch — с помощью макроса и X-макросов:
#define STATUS_ENUM(XX) \
XX(Ok) \
XX(Error) \
XX(Timeout)
enum class Status {
#define GENERATE_ENUM(name) name,
STATUS_ENUM(GENERATE_ENUM)
#undef GENERATE_ENUM
};
inline const char* to_string(Status s) {
switch(s) {
#define GENERATE_CASE(name) case Status::name: return #name;
STATUS_ENUM(GENERATE_CASE)
#undef GENERATE_CASE
default: return "Unknown";
}
}
Теперь достаточно один раз задать список значений — и не нужно вручную синхронизировать
enum
и to_string()
.✅ Такой подход легко масштабируется.
✅ Удобно для логирования, отладки и сериализации.
Пользуйтесь!
➡️ @cpp_geek
BY C++ geek
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/cpp_geek/307