40 template<
typename F,
template<
typename...>
class List,
typename... Args>
41 constexpr List<Args...>
GetInvokablePartImpl (
int, List<Args...>,
typename std::result_of<F (Args...)>::type* =
nullptr)
46 template<
typename F,
template<
typename...>
class List>
52 template<
typename F,
typename List>
55 template<
typename F,
template<
typename...>
class List,
typename... Args>
61 template<
typename F,
typename List>
64 using RetType_t = decltype (GetInvokablePartImpl<F> (0, List {}));
67 template<
typename F,
typename... Args>
68 constexpr
auto GetInvokablePart () -> decltype (GetInvokablePartImpl<F> (0, Typelist<Args...> {}))
73 template<
template<
typename...>
class List,
typename... Args>
74 constexpr
size_t Length (List<Args...>)
76 return sizeof... (Args);
88 template<
typename F,
typename List>
89 struct InvokableResGetter;
91 template<
typename F,
template<
typename...>
class List,
typename... Args>
92 struct InvokableResGetter<F, List<Args...>>
94 using RetType_t = std::result_of_t<F (Args...)>;
107 template<
typename... Args>
108 auto operator() (Args... args) ->
typename InvokableResGetter<F, decltype (GetInvokablePart<F, Args...> ())>
::RetType_t
111 auto ignoreList =
Drop<
Length (decltype (invokableList) {})> (Typelist<Args...> {});
112 return Invoke (invokableList, ignoreList, args...);
115 template<
typename... InvokableArgs,
typename... Rest>
116 auto Invoke (Typelist<InvokableArgs...>, Typelist<Rest...>, Dumbify<InvokableArgs>... args, Dumbify<Rest>...) -> std::result_of_t<F (InvokableArgs...)>
118 return F_ (std::forward<InvokableArgs> (args)...);