33 #include <type_traits> 40 template<
typename F,
typename... PrevArgs>
45 const std::tuple<PrevArgs...> m_prevArgs;
54 std::result_of_t<F (PrevArgs..., T)> invoke (
const T& arg,
int)
const 56 return invokeIndexed (arg, std::index_sequence_for<PrevArgs...> {});
62 template<
typename... IArgs>
69 template<
typename R,
typename C,
typename... Args>
70 struct Invoke<R (C::*) (Args...)>
72 auto operator() (R (C::*ptr) (Args...), C c, Args... rest)
74 return (c.*ptr) (rest...);
77 auto operator() (R (C::*ptr) (Args...), C *c, Args... rest)
79 return (c->*ptr) (rest...);
83 template<
typename T, std::size_t... Is>
84 auto invokeIndexed (
const T& arg, std::index_sequence<Is...>)
const ->
85 decltype (Invoke<F> {} (m_f, std::get<Is> (m_prevArgs)..., arg))
87 return Invoke<F> {} (m_f, std::get<Is> (m_prevArgs)..., arg);
91 auto invoke (
const T& arg, ...) const ->
CurryImpl<F, PrevArgs..., T>
93 return { m_f, std::tuple_cat (m_prevArgs, std::tuple<T> { arg }) };
97 auto operator() (
const T& arg)
const -> decltype (invoke (arg, 0))
99 return invoke (arg, 0);
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptr > > f
auto operator()(const T &arg) const -> decltype(invoke(arg, 0))
CurryImpl< F > Curry(F f)
CurryImpl(F f, const std::tuple< PrevArgs... > &prev)