Здравствуйте, so5team, Вы писали:
S>Ну вот, схематически из совсем свежего:
S>struct successful_result_t { ... };
S>struct failed_result_t { ... };
S>struct reply_t {
S> request_id_t id_;
S> worker_id_t worker_;
S> std::variant<successful_result_t, failed_result_t> result_;
S> template<typename Actual_Result>
S> reply_t(request_id_t id, worker_id_t worker, Actual_Result && result)
S> : id_{std::move(id)}, worker_{std::move(worker)}
S> , result_{std::forward<Actual_Result>(result)}
S> {}
S>};
S>Позволяет использовать один и тот же конструктор и для
S>return reply_t{id, self, successful_result_t{...}};
S>и для
S>return reply_t{id, self, failed_result_t{...}};
S>И останется таковым даже если список результатов расширится, например, когда добавятся overloaded_result_t, postponed_result_t и пр. Не говоря уже о том, что сам по себе std::variant и средства работы с ним -- это сплошная шаблонная магия.
S>Вы вместе с вашими матерыми C++ разработчиками вместо этого предлагаете что?
struct result_t
{
bool successful ;
...
}
Не надо сочинять сущности без необходимости.
За это раньше жгли на костре.
Или даже так:
struct result_t { ... };
// в случае ошибки
throw -1 ; // тогда тебе просто не нужны данные failed_result_t