Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 

69 Zeilen
2.1 KiB

  1. #pragma once
  2. #include <cppmp/core/checker.h>
  3. #include <cppmp/core/conditionals.h>
  4. #include "lambda_traits.h"
  5. namespace cppmp
  6. {
  7. namespace __impl
  8. {
  9. /* lambda_traits_impl */
  10. template<bool B_is_mutable, typename T_object, typename T_return, typename... T_args>
  11. struct lambda_traits_impl
  12. {
  13. using object_type = T_object;
  14. using return_type = T_return;
  15. using arguments_type = std::tuple<T_args...>;
  16. using is_mutable = bool_t<B_is_mutable>;
  17. using is_static = is_same<object_type, void>;
  18. using argument_count = size_t<sizeof...(T_args)>;
  19. static constexpr decltype(auto) is_mutable_v = is_mutable::value;
  20. static constexpr decltype(auto) is_static_v = is_static::value;
  21. static constexpr decltype(auto) argument_count_v = argument_count::value;
  22. template<std::size_t I>
  23. struct argument
  24. : public std::tuple_element<I, arguments_type>
  25. { };
  26. template<std::size_t I>
  27. using argument_t = typename argument<I>::type;
  28. };
  29. }
  30. /* lambda_traits */
  31. template<typename T_lambda>
  32. struct lambda_traits<
  33. T_lambda,
  34. enable_if_t<
  35. is_valid<decltype(&T_lambda::operator())>::value
  36. >>
  37. : public lambda_traits<decltype(&T_lambda::operator())>
  38. { };
  39. template<typename T_return, typename... T_args>
  40. struct lambda_traits<T_return (*)(T_args...), void>
  41. : public __impl::lambda_traits_impl<false, void, T_return, T_args...>
  42. { };
  43. template<typename T_object, typename T_return, typename... T_args>
  44. struct lambda_traits<T_return (T_object::*)(T_args...), void>
  45. : public __impl::lambda_traits_impl<true, T_object, T_return, T_args...>
  46. { };
  47. template<typename T_object, typename T_return, typename... T_args>
  48. struct lambda_traits<T_return (T_object::*)(T_args...) const, void>
  49. : public __impl::lambda_traits_impl<false, const T_object, T_return, T_args...>
  50. { };
  51. }