33 #include <type_traits> 41 template<
typename F,
typename... PrevArgs>
46 const std::tuple<PrevArgs...> m_prevArgs;
48 CurryImpl (F f,
const std::tuple<PrevArgs...>& prev)
55 std::result_of_t<F (PrevArgs..., T)> invoke (
const T& arg,
int)
const 57 return invokeIndexed (arg, std::index_sequence_for<PrevArgs...> {});
63 template<
typename... IArgs>
70 template<
typename R,
typename C,
typename... Args>
71 struct Invoke<R (C::*) (Args...)>
73 auto operator() (R (C::*ptr) (Args...), C c, Args... rest)
75 return (c.*ptr) (rest...);
78 auto operator() (R (C::*ptr) (Args...), C *c, Args... rest)
80 return (c->*ptr) (rest...);
84 template<
typename T, std::size_t... Is>
85 auto invokeIndexed (
const T& arg, std::index_sequence<Is...>)
const ->
86 decltype (Invoke<F> {} (m_f, std::get<Is> (m_prevArgs)..., arg))
88 return Invoke<F> {} (m_f, std::get<Is> (m_prevArgs)..., arg);
92 auto invoke (
const T& arg, ...)
const ->
CurryImpl<F, PrevArgs..., T>
94 return { m_f, std::tuple_cat (m_prevArgs, std::tuple<T> { arg }) };
98 auto operator() (
const T& arg)
const -> decltype (invoke (arg, 0))
100 return invoke (arg, 0);
auto operator()(const T &arg) const -> decltype(invoke(arg, 0))
CurryImpl< F > Curry(F f)
auto Invoke(F &&f, Args &&...args) -> decltype(std::forward< F >(f)(std::forward< Args >(args)...))
CurryImpl(F f, const std::tuple< PrevArgs... > &prev)