From bb05e3434ea488c805780b46f72e5b9357aa29e8 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Wed, 8 Feb 2023 22:03:41 -0800 Subject: [PATCH] feat: type traits for template template auto parameters added --- .../mp_units/bits/external/type_traits.h | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) 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();