#ifndef KGR_KANGARU_INCLUDE_KANGARU_DETAIL_FUNCTION_TRAITS_HPP #define KGR_KANGARU_INCLUDE_KANGARU_DETAIL_FUNCTION_TRAITS_HPP #include "meta_list.hpp" #include "void_t.hpp" #include namespace kgr { namespace detail { template struct has_call_operator : std::false_type {}; template struct has_call_operator> : std::true_type {}; template struct function_traits_helper {}; template struct base_function_traits { using object_type = Type; using return_type = R; using argument_types = meta_list; template using argument_type = meta_list_element_t; }; template struct base_non_member_function_traits { using return_type = R; using argument_types = meta_list; template using argument_type = meta_list_element_t; }; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_function_traits {}; template struct function_traits_helper : base_non_member_function_traits {}; template struct function_traits_helper : base_non_member_function_traits {}; template struct function_traits : function_traits_helper {}; template struct function_traits::value>::type> : function_traits_helper {}; template using function_arguments_t = typename function_traits::argument_types; template using function_result_t = typename function_traits::return_type; template using object_type_t = typename function_traits::object_type; template using function_argument_t = typename function_traits::template argument_type; } // namespace detail } // namespace kgr #endif // KGR_KANGARU_INCLUDE_KANGARU_DETAIL_FUNCTION_TRAITS_HPP