14template <
typename ... Args>
18template <
typename ReturnType,
typename... Args>
19struct function_traits_defs
21 static constexpr bool is_callable =
true;
22 static constexpr size_t arity =
sizeof...(Args);
23 using return_type = ReturnType;
24 using args = arg_list<Args ...>;
29struct function_traits_impl {
30 static constexpr bool is_callable =
false;
34template <
typename ReturnType,
typename... Args>
35struct function_traits_impl<ReturnType(Args...)>
36 : function_traits_defs<ReturnType, Args...> {};
39template <
typename ReturnType,
typename... Args>
40struct function_traits_impl<ReturnType(*)(Args...)>
41 : function_traits_defs<ReturnType, Args...> {};
44template <
typename ClassType,
typename ReturnType,
typename... Args>
45struct function_traits_impl<ReturnType(ClassType::*)(Args...)>
46 : function_traits_defs<ReturnType, Args...> {};
49template <
typename ClassType,
typename ReturnType,
typename... Args>
50struct function_traits_impl<ReturnType(ClassType::*)(Args...) const>
51 : function_traits_defs<ReturnType, Args...> {};
54template <
typename ClassType,
typename ReturnType,
typename... Args>
55struct function_traits_impl<ReturnType(ClassType::*)(Args...) const&>
56 : function_traits_defs<ReturnType, Args...> {};
59template <
typename ClassType,
typename ReturnType,
typename... Args>
60struct function_traits_impl<ReturnType(ClassType::*)(Args...) const&&>
61 : function_traits_defs<ReturnType, Args...> {};
64template <
typename ClassType,
typename ReturnType,
typename... Args>
65struct function_traits_impl<ReturnType(ClassType::*)(Args...) volatile>
66 : function_traits_defs<ReturnType, Args...> {};
69template <
typename ClassType,
typename ReturnType,
typename... Args>
70struct function_traits_impl<ReturnType(ClassType::*)(Args...) volatile&>
71 : function_traits_defs<ReturnType, Args...> {};
74template <
typename ClassType,
typename ReturnType,
typename... Args>
75struct function_traits_impl<ReturnType(ClassType::*)(Args...) volatile&&>
76 : function_traits_defs<ReturnType, Args...> {};
79template <
typename ClassType,
typename ReturnType,
typename... Args>
80struct function_traits_impl<ReturnType(ClassType::*)(Args...) const volatile>
81 : function_traits_defs<ReturnType, Args...> {};
84template <
typename ClassType,
typename ReturnType,
typename... Args>
85struct function_traits_impl<ReturnType(ClassType::*)(Args...) const volatile&>
86 : function_traits_defs<ReturnType, Args...> {};
89template <
typename ClassType,
typename ReturnType,
typename... Args>
90struct function_traits_impl<ReturnType(ClassType::*)(Args...) const volatile&&>
91 : function_traits_defs<ReturnType, Args...> {};
94template <
typename T,
typename V =
void>
95struct function_traits_no_cv
96 : function_traits_impl<T> {};
100struct function_traits_no_cv<T, decltype((void)&T::operator())>
101 : function_traits_impl<decltype(&T::operator())> {};
105struct function_traits
106 : function_traits_no_cv< decay_t<T> > {};
114 static constexpr bool value = _::function_traits<T>::is_callable;
120 static constexpr int value = _::function_traits<T>::arity;
132template<
typename Func,
typename ... Args>
136template<
typename Func,
typename T,
typename ... Args>
142template<
typename Func>
148template <
typename Func>
152template<
typename Func,
typename ... Args>
156template<
typename Func,
typename First,
typename T,
typename ... Args>
162template<
typename Func>
168template <
typename Func>
typename _::function_traits< T >::args arg_list_t
Get the argument list type of a callable.
typename _::function_traits< T >::return_type return_type_t
Get the return type of a callable.
typename first_arg< Func >::type first_arg_t
Convenience alias for the first argument type of a callable.
typename second_arg< Func >::type second_arg_t
Convenience alias for the second argument type of a callable.
Trait to get the number of arguments of a callable.
Extract the first argument type from a callable (implementation).
Get the first argument type of a callable.
Trait to check if a type is callable.
Extract the second argument type from a callable (implementation).
Get the second argument type of a callable.