Для того, чтобы добавить в версии 5.5.3 поддержку ограничений на временя жизни сообщений и зарегистрированную доставку, предполагается добавить несколько новых вариантов функции so_5::send. Ниже показаны примеры того, как может выглядеть использование этих вариантов. Прошу высказываться на тему того, нравится или не нравится, может есть какие-то другие идеи.

В качестве небольшого примечания: новый синтаксис позволяет так же выразить и обращение к синхронным сервисам.

Итак, предположим, что агенту с mbox-ом handler отсылается сообщение request (объект хранится внутри std::unique_ptr<request>), агент-обработчик обрабатывает request посредством event-handler-а, возвращающего объект reply.

using namespace std::chrono;
using namespace so_5;

// Простая отсылка асинхронного сообщения.
send(handler, std::move(request));

// Отсылка сообщения с ограничением времени доставки.
// Если сообщение не было доставлено, оно просто выбрасывается.
send(handler, message_lifetime(10ms), std::move(request));

// Отсылка сообщения с ограничением времени доставки.
// Если сообщение не было доставлено, то вызывается указанный обработчик.
// Обработчик может делать что захочет, например, отсылать кому-то
// какое-нибудь уведомление.
send(handler, message_lifetime(10ms).on_deadline(action), std::move(request));

// Отсылка сообщения с ограничением времени доставки и заказом очета о доставке.
// Отчет будет присылаться текущему агенту на его direct-mbox.
send(handler,
    message_lifetime(10ms) & registered_delivery(*this),
    std::move(request));

// Отсылка сообщения с заказом отчета о доставке.
// Никаких ограничений на время его жизни.
send(handler, registered_delivery(*this), std::move(request));

// Отсылка сообщения с получением результата в виде std::future.
// Т.е. обращение к синхронному сервису.
// Тип f будет std::future<reply>.
auto f = send(handler, result_by_future<reply>(), std::move(request));

// Отсылка сообщения с получением результате в виде std::future и
// ограничением на время жизни.
auto f2 = send(handler,
    message_lifetime(10ms) & result_by_future<reply>(),
    std::move(request));

// Отсылка сообщения с ожиданием получения результата
// (т.е. обращение к синхронном сервису с ожиданием внутри send-а).
// Тип f будет reply.
auto r = send(handler, wait_result<reply>(10ms), std::move(request));

// Отсылка сообщения с ожиданием получения результата
// (т.е. обращение к синхронном сервису с ожиданием внутри send-а).
// Задается ограничение на время доставки сообщения.
auto r = send(handler,
    message_lifetime(10ms) & wait_result<reply>(10ms),
    std::move(request));

// Отсылка сообщение и получение результата обработки в виде
// ответного сообщения processing_result, внутри которого будет
// храниться объект reply.
// Ответ присылается текущему агенту на его direct-mbox.
send(handler,
    result_by_message<reply, processing_result>(*this),
    std::move(request));

// Отсылка сообщение и получение результата обработки в виде
// ответного сообщения processing_result, внутри которого будет
// храниться объект reply.
// Ответ присылается текущему агенту на его direct-mbox.
// На доставку сообщения устанавливается ограничение по времени.
send(handler,
    message_lifetime(10ms) & result_by_message<reply, processing_result>(*this),
    std::move(request));