選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

78 行
2.0 KiB

  1. #pragma once
  2. #include <type_traits>
  3. namespace utl {
  4. namespace mp {
  5. template<typename T>
  6. using add_pointer = T*;
  7. template<typename T>
  8. using add_reference = T&;
  9. template<typename T>
  10. using remove_ptr = typename std::remove_pointer<T>::type;
  11. template<typename T>
  12. using remove_const = typename std::remove_const<T>::type;
  13. template<typename T>
  14. using remove_cv = typename std::remove_cv<T>::type;
  15. template<typename T>
  16. using remove_ref = typename std::remove_reference<T>::type;
  17. template<typename T>
  18. using clean_type = remove_cv<remove_ptr<remove_ref<T>>>;
  19. namespace __impl /* forward declaration */
  20. {
  21. template<typename T, typename U = remove_ref<T>>
  22. struct decay_impl;
  23. template<typename T, typename U, typename = void>
  24. struct common_type_impl
  25. { };
  26. }
  27. template<class T>
  28. using decay = __impl::decay_impl<T>;
  29. template<class T>
  30. using decay_type = typename __impl::decay_impl<T>::type;
  31. template<typename T, typename U>
  32. using common_type = __impl::common_type_impl<T, U>;
  33. namespace __impl /* implementation */
  34. {
  35. /* decay */
  36. template <typename T, typename U>
  37. struct decay_impl
  38. { using type = remove_cv<U>; };
  39. template <typename T, typename U>
  40. struct decay_impl<T, U[]>
  41. { using type = U*; };
  42. template <typename T, typename U, std::size_t N>
  43. struct decay_impl<T, U[N]>
  44. { using type = U*; };
  45. template <typename T, typename R, typename ...A>
  46. struct decay_impl<T, R(A...)>
  47. { using type = R(*)(A...); };
  48. template <typename T, typename R, typename ...A>
  49. struct decay_impl<T, R(A..., ...)>
  50. { using type = R(*)(A..., ...); };
  51. /* common_type */
  52. template<typename T, typename U>
  53. struct common_type_impl<T, U, decltype((void)(true ? std::declval<T>() : std::declval<U>()))>
  54. { using type = decay<decltype((void)(true ? std::declval<T>() : std::declval<U>()))>; };
  55. }
  56. }
  57. }