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 bc227acc..5f3779ee 100644 --- a/src/core/include/mp_units/bits/external/type_traits.h +++ b/src/core/include/mp_units/bits/external/type_traits.h @@ -65,6 +65,12 @@ inline constexpr bool is_specialization_of = false; template typename Type> inline constexpr bool is_specialization_of, Type> = true; +template typename Type> +inline constexpr bool is_specialization_of_v = false; + +template typename Type> +inline constexpr bool is_specialization_of_v, Type> = true; + // is_derived_from_specialization_of namespace detail { @@ -92,6 +98,12 @@ consteval bool contains() return (false || ... || is_specialization_of); } +template typename T, typename... Ts> +consteval bool contains() +{ + return (false || ... || is_specialization_of_v); +} + template auto V> consteval auto get() { @@ -117,7 +129,23 @@ consteval auto get() template typename T, typename T1, typename T2, typename... Ts> consteval auto get() { - if constexpr (is_specialization_of) + if constexpr (is_specialization_of) + return T1{}; + else + return get(); +} + +template typename T, typename T1> + requires is_specialization_of_v +consteval auto get() +{ + return T1{}; +} + +template typename T, typename T1, typename T2, typename... Ts> +consteval auto get() +{ + if constexpr (is_specialization_of_v) return T1{}; else return get();