Created
December 9, 2014 15:20
-
-
Save windoze/9f93deb6b5a6ed8a4e21 to your computer and use it in GitHub Desktop.
make_function(Fn) and make_function_type<Fn>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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