From fc7e1358cbbe66f249f471e423832e2d62193d9a Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Fri, 19 Jan 2024 16:03:21 +0100 Subject: [PATCH] feat: `underlying_type` type trait added --- .../mp-units/bits/external/type_traits.h | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/core/include/mp-units/bits/external/type_traits.h b/src/core/include/mp-units/bits/external/type_traits.h index 65223343..f98db6c9 100644 --- a/src/core/include/mp-units/bits/external/type_traits.h +++ b/src/core/include/mp-units/bits/external/type_traits.h @@ -83,6 +83,36 @@ template typename Type> // inline constexpr bool // TODO: Replace with concept when it works with MSVC concept is_derived_from_specialization_of = requires(T* t) { detail::to_base_specialization_of(t); }; + +namespace detail { + +template +struct get_value_type { + using type = MP_UNITS_TYPENAME T::value_type; +}; + +template +struct get_element_type { + using type = std::remove_reference_t; +}; + +} // namespace detail + +template +struct underlying_type { + using type = T; +}; + +template + requires requires { typename T::value_type; } || requires { typename T::element_type; } +struct underlying_type { + using type = MP_UNITS_TYPENAME + conditional, detail::get_element_type>::type; +}; + +template +using underlying_type_t = MP_UNITS_TYPENAME underlying_type::type; + template concept one_of = (false || ... || std::same_as);