#pragma once #include #include namespace sqlite { namespace utility { template struct function_traits; template struct function_traits : public function_traits< decltype(&std::remove_reference::type::operator()) > { }; template < typename ClassType, typename ReturnType, typename... Arguments > struct function_traits< ReturnType(ClassType::*)(Arguments...) const > : function_traits { }; /* support the non-const operator () * this will work with user defined functors */ template < typename ClassType, typename ReturnType, typename... Arguments > struct function_traits< ReturnType(ClassType::*)(Arguments...) > : function_traits { }; template < typename ReturnType, typename... Arguments > struct function_traits< ReturnType(*)(Arguments...) > { typedef ReturnType result_type; template using argument = typename std::tuple_element< Index, std::tuple >::type; static const std::size_t arity = sizeof...(Arguments); }; } }