32 #include <type_traits> 38 template<
typename F,
typename... Args>
39 auto Invoke (F&& f, Args&&... args) -> decltype (std::forward<F> (f) (std::forward<Args> (args)...))
41 return std::forward<F> (f) (std::forward<Args> (args)...);
44 template<
typename Base,
typename Real,
typename Res>
45 auto Invoke (Res Base::* mem, Real&& obj,
46 typename std::enable_if<!std::is_member_function_pointer<decltype (mem)>::value>::type* =
nullptr) -> decltype (obj.*mem)
51 template<
typename Base,
typename Real,
typename Res,
typename... Rest>
52 auto Invoke (Res Base::* mem, Real&& obj, Rest&&... rest) -> decltype ((obj.*mem) (std::forward<Rest> (rest)...))
54 return (obj.*mem) (std::forward<Rest> (rest)...);
57 template<
typename Base,
typename Real,
typename Res,
typename... Rest>
58 auto Invoke (Res Base::* mem, Real&& obj, Rest&&... rest) -> decltype ((obj->*mem) (std::forward<Rest> (rest)...))
60 return (obj->*mem) (std::forward<Rest> (rest)...);
66 template<
bool B,
class T =
void>
70 using Decay_t =
typename std::decay<T>::type;
typename std::result_of< T >::type ResultOf_t
typename std::decay< T >::type Decay_t
typename std::enable_if< B, T >::type EnableIf_t
auto Invoke(F &&f, Args &&...args) -> decltype(std::forward< F >(f)(std::forward< Args >(args)...))