15 #ifndef ROOT7_Impl_Tuple_Apply
16 #define ROOT7_Impl_Tuple_Apply
26 template <
class F,
class... Args>
27 inline auto INVOKE(
F&& f, Args&&... args) ->
28 decltype(std::forward<F>(f)(std::forward<Args>(args)...)) {
29 return std::forward<F>(
f)(std::forward<Args>(args)...);
32 template <
class Base,
class T,
class Derived>
33 inline auto INVOKE(T Base::*pmd, Derived&& ref) ->
34 decltype(std::forward<Derived>(ref).*pmd) {
35 return std::forward<Derived>(ref).*pmd;
38 template <
class PMD,
class Po
inter>
39 inline auto INVOKE(PMD pmd, Pointer&& ptr) ->
40 decltype((*std::forward<Pointer>(ptr)).*pmd) {
41 return (*std::forward<Pointer>(ptr)).*pmd;
44 template <
class Base,
class T,
class Derived,
class... Args>
45 inline auto INVOKE(T Base::*pmf, Derived&& ref, Args&&... args) ->
46 decltype((std::forward<Derived>(ref).*pmf)(std::forward<Args>(args)...)) {
47 return (std::forward<Derived>(ref).*pmf)(std::forward<Args>(args)...);
50 template <
class PMF,
class Pointer,
class... Args>
51 inline auto INVOKE(PMF pmf, Pointer&& ptr, Args&&... args) ->
52 decltype(((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(args)...)) {
53 return ((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(args)...);
57 template<
class F,
class... ArgTypes>
58 decltype(
auto) invoke(
F&& f, ArgTypes&&... args) {
59 return detail::INVOKE(std::forward<F>(f), std::forward<ArgTypes>(args)...);
66 std::index_sequence<
I...>) {
67 return invoke(std::forward<F>(f),
68 std::get<I>(std::forward<Tuple>(t))...);
73 template<
class F,
class Tuple>
74 constexpr decltype(
auto) apply(
F &&f, Tuple &&t) {
76 std::make_index_sequence < std::tuple_size <
77 std::decay_t < Tuple >> {} > {});
81 #endif //ROOT7_TUPLE_APPLY_H
auto INVOKE(F &&f, Args &&...args) -> decltype(std::forward< F >(f)(std::forward< Args >(args)...))
decltype(auto) constexpr apply_impl(F &&f, Tuple &&t, std::index_sequence< I...>)