Get Mystery Box with random crypto!

Status macros English version: https://telegra.ph/Status-macr | Sea

Status macros

English version: https://telegra.ph/Status-macros-11-14

В продолжение к предыдущему посту об удобном способе обработки ошибок в C++.

В гугловых проектах используются специальные классы Status и StatusOr (см. https://t.me/sea_plus_plus/23), которые возвращаются из методов, в которых может произойти ошибка, например
Status WriteToFile(std::string_view content);
или
StatusOr ReadFromFile();

Обычным способом проверки является if:
Status Write(std::string_view content) {
Status status = WriteToFile(content);
if (!status.ok())
return status;

return Status::OK();
}

StatusOr Read() {
StatusOr content = ReadFromFile();
if (!content.ok())
return content.status();

return content.ValueOrDie();
}

Но это громоздко. В основном, используются специальные макросы (https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/stubs/status_macros.h):
Status Write(std::string_view content) {
RETURN_IF_ERROR(WriteToFile(content));
return Status::OK();
}

StatusOr Read() {
std::string content;
ASSIGN_OR_RETURN(content, ReadFromFile());
return content;
}

Макросы, в общем случае, не рекомендуется использовать в C++. Но тут, на мой взгляд, они вполне оправданы. К тому же в if внутри макроса можно поставить атрибут [[unlikely]] и получить прирост в производительности, а так пришлось бы в каждый if писать ее явно. В общем, в этом случае только польза.