Skip to content

Instantly share code, notes, and snippets.

@windoze
Created December 9, 2014 15:20
Show Gist options
  • Save windoze/9f93deb6b5a6ed8a4e21 to your computer and use it in GitHub Desktop.
Save windoze/9f93deb6b5a6ed8a4e21 to your computer and use it in GitHub Desktop.
make_function(Fn) and make_function_type<Fn>
// make_function
template<typename T> struct remove_class { };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...)> { using type = R(A...); };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...) const> { using type = R(A...); };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...) volatile> { using type = R(A...); };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...) const volatile> { using type = R(A...); };
template<typename T>
struct get_signature_impl
{ using type = typename remove_class<decltype(&std::remove_reference<T>::type::operator())>::type; };
template<typename R, typename... A>
struct get_signature_impl<R(A...)> { using type = R(A...); };
template<typename R, typename... A>
struct get_signature_impl<R(&)(A...)> { using type = R(A...); };
template<typename R, typename... A>
struct get_signature_impl<R(*)(A...)> { using type = R(A...); };
template<typename T> using get_signature = typename get_signature_impl<T>::type;
template<typename F> using make_function_type = std::function<get_signature<F>>;
template<typename F> make_function_type<F> make_function(F &&f)
{ return make_function_type<F>(std::forward<F>(f)); }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment