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>
52 auto Invoke (Res Base::* mem, Real&& obj) -> decltype ((obj.*mem) ())
57 template<
typename Base,
typename Real,
typename Res>
58 auto Invoke (Res Base::* mem, Real&& obj) -> decltype ((obj->*mem) ())
60 return (obj->*mem) ();
auto Invoke(F &&f, Args &&...args) -> decltype(std::forward< F >(f)(std::forward< Args >(args)...))