typename detail::deduce_output_type<
   detail::type_list<Sigs...>,
   detail::type_list<
     typename detail::implicit_conversions<
       typename std::decay<Ts>::type
     >::type...
   >
 >::delegated_type
 delegate(message_priority mp, const typed_actor<Sigs...>& dest, Ts&&... xs) {
   static_assert(sizeof...(Ts) > 0, "no message to send");
   using token =
     detail::type_list<
       typename detail::implicit_conversions<
         typename std::decay<Ts>::type
       >::type...>;
   token tk;
   check_typed_input(dest, tk);
   if (! dest)
     return {};
   auto mid = current_element_->mid;
   current_element_->mid = mp == message_priority::high
                            ? mid.with_high_priority()
                            : mid.with_normal_priority();
   current_element_->msg = make_message(std::forward<Ts>(xs)...);
   dest->enqueue(std::move(current_element_), host());
   return {};
 }
 inline void monitor(const typed_actor<Ts...>& whom) {
   monitor(whom.address());
 }
 void send_exit(const typed_actor<Rs...>& whom, uint32_t reason) {
   send_exit(whom.address(), reason);
 }