CPP_GEEK Telegram 307
💡 Сегодня покажу вам способ, как удобно логировать 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
👍9🥴7



tgoop.com/cpp_geek/307
Create:
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


Share with your friend now:
tgoop.com/cpp_geek/307

View MORE
Open in Telegram


Telegram News

Date: |

Over 33,000 people sent out over 1,000 doxxing messages in the group. Although the administrators tried to delete all of the messages, the posting speed was far too much for them to keep up. The administrator of a telegram group, "Suck Channel," was sentenced to six years and six months in prison for seven counts of incitement yesterday. Just as the Bitcoin turmoil continues, crypto traders have taken to Telegram to voice their feelings. Crypto investors can reduce their anxiety about losses by joining the “Bear Market Screaming Therapy Group” on Telegram. Your posting frequency depends on the topic of your channel. If you have a news channel, it’s OK to publish new content every day (or even every hour). For other industries, stick with 2-3 large posts a week. To upload a logo, click the Menu icon and select “Manage Channel.” In a new window, hit the Camera icon.
from us


Telegram C++ geek
FROM American