32 #include <type_traits>
39 template<
typename F,
typename... Args>
40 auto Invoke (F&& f, Args&&... args) -> decltype (std::forward<F> (f) (std::forward<Args> (args)...))
42 return std::forward<F> (f) (std::forward<Args> (args)...);
45 template<
typename Base,
typename Real,
typename Res>
46 auto Invoke (Res Base::* mem, Real&& obj,
47 typename std::enable_if<!std::is_member_function_pointer<decltype (mem)>::value>::type* =
nullptr) -> decltype (obj.*mem)
52 template<
typename Base,
typename Real,
typename Res,
typename... Rest>
53 auto Invoke (Res Base::* mem, Real&& obj, Rest&&... rest) -> decltype ((obj.*mem) (std::forward<Rest> (rest)...))
55 return (obj.*mem) (std::forward<Rest> (rest)...);
58 template<
typename Base,
typename Real,
typename Res,
typename... Rest>
59 auto Invoke (Res Base::* mem, Real&& obj, Rest&&... rest) -> decltype ((obj->*mem) (std::forward<Rest> (rest)...))
61 return (obj->*mem) (std::forward<Rest> (rest)...);
68 template<
typename F,
typename Tuple,
size_t... Is>
69 auto ApplyImpl (F&& f, Tuple&& t, std::index_sequence<Is...>)
71 return Invoke (std::forward<F> (f), std::get<Is> (std::forward<Tuple> (t))...);
75 template<
typename F,
typename Tuple>
76 auto Apply (F&& f, Tuple&& tuple)
79 std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>> {}> {});
auto ApplyImpl(F &&f, Tuple &&t, std::index_sequence< Is...>)
auto Apply(F &&f, Tuple &&tuple)
auto Invoke(F &&f, Args &&...args) -> decltype(std::forward< F >(f)(std::forward< Args >(args)...))