fork(1) download
  1. #include <tuple>
  2. #include <type_traits>
  3.  
  4. /// @class FunctionTraits is a common traits class for various types:
  5. /// ordinary functions, function objects and lambdas
  6. template <typename>
  7. struct FunctionTraits;
  8.  
  9. template <typename ReturnT, typename...ParamT>
  10. struct FunctionTraits<ReturnT(ParamT...)>
  11. {
  12. static constexpr size_t Arity = sizeof...(ParamT);
  13. using Signature = ReturnT(ParamT...);
  14. using ReturnType = ReturnT;
  15. using ParameterTypes = std::tuple<ParamT...>;
  16. };
  17.  
  18. template <typename ReturnT, typename...ParamT>
  19. struct FunctionTraits<ReturnT(*)(ParamT...)> : FunctionTraits<ReturnT(ParamT...)> {};
  20.  
  21. template <typename T, typename ReturnT, typename...ParamT>
  22. struct FunctionTraits<ReturnT(T::*)(ParamT...)> : FunctionTraits<ReturnT(ParamT...)> {};
  23.  
  24. template <typename T, typename ReturnT, typename...ParamT>
  25. struct FunctionTraits<ReturnT(T::*)(ParamT...) const> : FunctionTraits<ReturnT(ParamT...)> {};
  26.  
  27. template <typename T>
  28. struct FunctionTraits : FunctionTraits<decltype(&std::decay<T>::type::operator())> {};
  29.  
  30. ///@brief Get function arity
  31. template <typename T>
  32. constexpr size_t FunctionArity = FunctionTraits<T>::Arity;
  33.  
  34. ///@brief Get function signature
  35. template <typename T>
  36. using FunctionSignature = typename FunctionTraits<T>::Signature;
  37.  
  38. ///@brief Get function return type
  39. template <typename T>
  40. using FunctionReturnType = typename FunctionTraits<T>::ReturnType;
  41.  
  42. ///@brief Get function parameter type by its order index
  43. template <typename T, size_t I>
  44. using FunctionParameterType = typename std::tuple_element<I, typename FunctionTraits<T>::ParameterTypes>::type;
  45.  
  46.  
  47. int main()
  48. {
  49. auto lambda = [](int, double, const std::string&) { return 42; };
  50. using LambdaType = decltype(lambda);
  51.  
  52. static_assert(FunctionArity<LambdaType> == 3, "");
  53. static_assert(std::is_same<int, FunctionParameterType<LambdaType, 0>>::value, "");
  54. static_assert(std::is_same<double, FunctionParameterType<LambdaType, 1>>::value, "");
  55. static_assert(std::is_same<const std::string&, FunctionParameterType<LambdaType, 2>>::value, "");
  56. static_assert(std::is_same<int, FunctionReturnType<LambdaType>>::value, "");
  57. }
  58.  
Success #stdin #stdout 0s 15232KB
stdin
Standard input is empty
stdout
Standard output is empty