std::int32_t call(state_t &state, T *obj, R(T::*handler)(Args...), std::uint32_t offset = 0, typename std::enable_if<std::is_same<R, void>::value>::type * = nullptr) { call_impl(state, make_obj(obj, handler), offset); return 0; }
std::int32_t call(state_t &state, R(*handler)(Args...), typename std::enable_if<std::is_same<R, void>::value>::type * = nullptr) { call_impl(state, make_obj(handler), 0); return 0; }
inline predicate_result operator()( Left const& left, Right const& right ) const { typedef typename is_array<Left>::type left_is_array; return call_impl( left, right, left_is_array() ); }
std::uint32_t call(state_t &state, HandlerT *handler, typename std::enable_if<std::is_same<R, void>::value>::type * = nullptr) { call_impl(state, make_obj<R, HandlerT, Args...>(handler), 0); return 0; }
std::uint32_t call(state_t &state, HandlerT *handler, typename std::enable_if<!std::is_same<R, void>::value>::type * = nullptr) { using result_t = std::remove_cv<R>::type; return convertion_t<result_t>::to(state, call_impl(state, make_obj<R, HandlerT, Args...>(handler), 0)); }
std::int32_t call(state_t &state, T *obj, R(T::*handler)(Args...), std::uint32_t offset = 0, typename std::enable_if<!std::is_same<R, void>::value>::type * = nullptr) { using result_t = std::remove_cv<R>::type; return convertion_t<result_t>::to(state, call_impl(state, make_obj(obj, handler), offset)); }
inline void call(state_t &state, T *obj, const std::tuple<Args...> &args) { call_impl(state, make_obj(obj, args), 1); }
auto call(F f, std::tuple<Args...> t) { return call_impl(f, t, make_index_seq<sizeof...(Args)>{}); }
static SPROUT_CONSTEXPR type call(src_type const& e) { return call_impl(sprout::index_range<0, sizeof...(Args)>::make()); }
auto call(Fn&& fn, std::tuple<Args...> const& args) { return call_impl(fn, args, std::make_index_sequence<sizeof...(Args)>{}); }