Skip to content

Instantly share code, notes, and snippets.

@windoze
Created December 9, 2014 15:24
Show Gist options
  • Save windoze/bd2b176884de7791cfff to your computer and use it in GitHub Desktop.
Save windoze/bd2b176884de7791cfff to your computer and use it in GitHub Desktop.
Call any callable with perfect forwarding
template <class Fp, class A0, class... Args>
inline auto invoke(Fp&& f, A0&& a0, Args&&... args)
-> decltype((std::forward<A0>(a0).*f)(std::forward<Args>(args)...))
{ return (std::forward<A0>(a0).*f)(std::forward<Args>(args)...); }
template <class Fp, class A0, class... Args>
inline auto invoke(Fp&& f, A0&& a0, Args&&... args)
-> decltype(((*std::forward<A0>(a0)).*f)(std::forward<Args>(args)...))
{ return ((*std::forward<A0>(a0)).*f)(std::forward<Args>(args)...); }
template <class Fp, class A0>
inline auto invoke(Fp&& f, A0&& a0)
-> decltype(std::forward<A0>(a0).*f)
{ return std::forward<A0>(a0).*f; }
template <class Fp, class A0>
inline auto invoke(Fp&& f, A0&& a0)
-> decltype((*std::forward<A0>(a0)).*f)
{ return (*std::forward<A0>(a0)).*f; }
template <class Fp, class... Args>
inline auto invoke(Fp&& f, Args&&... args)
-> decltype(std::forward<Fp>(f)(std::forward<Args>(args)...))
{ return std::forward<Fp>(f)(std::forward<Args>(args)...); }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment