Commit 2018c179 authored by ufownl's avatar ufownl

Improve type-safety

Relates #172
parent b2743b7a
......@@ -229,6 +229,25 @@ struct common_result_type<T1, T2, Us...> {
using type = void;
};
template <class OrigSigs, class DestSigs, class ArgTypes>
struct sender_signature_checker {
static void check() {
using dest_output_types =
typename deduce_output_type<
DestSigs, ArgTypes
>::type::first;
sender_signature_checker<
DestSigs, OrigSigs,
dest_output_types
>::check();
}
};
template <class OrigSigs, class DestSigs>
struct sender_signature_checker<OrigSigs, DestSigs, detail::type_list<void>> {
static void check() {}
};
} // namespace detail
} // namespace caf
......
......@@ -40,6 +40,9 @@ template <class... Sigs>
class typed_event_based_actor
: public abstract_event_based_actor<typed_behavior<Sigs...>, true> {
public:
using base_type =
abstract_event_based_actor<typed_behavior<Sigs...>, true>;
using signatures = detail::type_list<Sigs...>;
using behavior_type = typed_behavior<Sigs...>;
......@@ -61,6 +64,67 @@ class typed_event_based_actor
}
}
using base_type::send;
using base_type::delayed_send;
template <class... DestSigs, class... Ts>
void send(message_priority mp, const typed_actor<Sigs...>& dest, Ts&&... xs) {
detail::sender_signature_checker<
detail::type_list<Sigs...>,
detail::type_list<DestSigs...>,
detail::type_list<
typename detail::implicit_conversions<
typename std::decay<Ts>::type
>::type...
>
>::check();
base_type::send(mp, dest, std::forward<Ts>(xs)...);
}
template <class... DestSigs, class... Ts>
void send(const typed_actor<DestSigs...>& dest, Ts&&... xs) {
detail::sender_signature_checker<
detail::type_list<Sigs...>,
detail::type_list<DestSigs...>,
detail::type_list<
typename detail::implicit_conversions<
typename std::decay<Ts>::type
>::type...
>
>::check();
base_type::send(dest, std::forward<Ts>(xs)...);
}
template <class... DestSigs, class... Ts>
void delayed_send(message_priority mp, const typed_actor<Sigs...>& dest,
const duration& rtime, Ts&&... xs) {
detail::sender_signature_checker<
detail::type_list<Sigs...>,
detail::type_list<DestSigs...>,
detail::type_list<
typename detail::implicit_conversions<
typename std::decay<Ts>::type
>::type...
>
>::check();
base_type::delayed_send(mp, dest, rtime, std::forward<Ts>(xs)...);
}
template <class... DestSigs, class... Ts>
void delayed_send(const typed_actor<Sigs...>& dest,
const duration& rtime, Ts&&... xs) {
detail::sender_signature_checker<
detail::type_list<Sigs...>,
detail::type_list<DestSigs...>,
detail::type_list<
typename detail::implicit_conversions<
typename std::decay<Ts>::type
>::type...
>
>::check();
base_type::delayed_send(dest, rtime, std::forward<Ts>(xs)...);
}
protected:
virtual behavior_type make_behavior() = 0;
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment