You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.9 KiB

1 year ago
  1. #pragma once
  2. #include <type_traits>
  3. #include <tuple>
  4. #include <functional>
  5. namespace vlc
  6. {
  7. template <typename T>
  8. struct function_traits
  9. : public function_traits<decltype(&T::operator())>
  10. {};
  11. template<typename R, typename ...Args>
  12. struct function_traits<R(Args...)>
  13. {
  14. static const size_t nargs = sizeof...(Args);
  15. using result_type = R;
  16. using function_type = R(Args...);
  17. template <size_t i>
  18. struct arg
  19. {
  20. using type = typename std::tuple_element<i, std::tuple<Args...>>::type;
  21. };
  22. };
  23. template <typename ReturnType, typename... Args>
  24. struct function_traits<ReturnType(*)(Args...)>
  25. : public function_traits<ReturnType(Args...)>
  26. {};
  27. template <typename ClassType, typename ReturnType, typename... Args>
  28. struct function_traits<ReturnType(ClassType::*)(Args...)>
  29. : public function_traits<ReturnType(Args...)>
  30. {
  31. typedef ClassType& owner_type;
  32. };
  33. template <typename ClassType, typename ReturnType, typename... Args>
  34. struct function_traits<ReturnType(ClassType::*)(Args...) const>
  35. : public function_traits<ReturnType(Args...)>
  36. {
  37. typedef const ClassType& owner_type;
  38. };
  39. template <typename ClassType, typename ReturnType, typename... Args>
  40. struct function_traits<ReturnType(ClassType::*)(Args...) volatile>
  41. : public function_traits<ReturnType(Args...)>
  42. {
  43. typedef volatile ClassType& owner_type;
  44. };
  45. template <typename ClassType, typename ReturnType, typename... Args>
  46. struct function_traits<ReturnType(ClassType::*)(Args...) const volatile>
  47. : public function_traits<ReturnType(Args...)>
  48. {
  49. typedef const volatile ClassType& owner_type;
  50. };
  51. template <typename FunctionType>
  52. struct function_traits<std::function<FunctionType>>
  53. : public function_traits<FunctionType>
  54. {};
  55. }