diff --git a/src/core/include/mp-units/bits/dimension_concepts.h b/src/core/include/mp-units/bits/dimension_concepts.h index 1bb908b2..cd8b2b9d 100644 --- a/src/core/include/mp-units/bits/dimension_concepts.h +++ b/src/core/include/mp-units/bits/dimension_concepts.h @@ -34,7 +34,11 @@ struct base_dimension; namespace detail { template -void to_base_base_dimension(const volatile base_dimension*); +void to_base_specialization_of_base_dimension(const volatile base_dimension*); + +template +inline constexpr bool is_derived_from_specialization_of_base_dimension = + requires(T* t) { to_base_specialization_of_base_dimension(t); }; template inline constexpr bool is_specialization_of_base_dimension = false; @@ -48,7 +52,8 @@ inline constexpr bool is_specialization_of_base_dimension * Satisfied by all dimension types derived from a specialization of `base_dimension`. */ template -concept BaseDimension = requires(T* t) { to_base_base_dimension(t); } && (!is_specialization_of_base_dimension); +concept BaseDimension = + is_derived_from_specialization_of_base_dimension && (!is_specialization_of_base_dimension); template struct is_dimension_one : std::false_type {}; diff --git a/src/core/include/mp-units/bits/quantity_concepts.h b/src/core/include/mp-units/bits/quantity_concepts.h index f8f065e2..a544be61 100644 --- a/src/core/include/mp-units/bits/quantity_concepts.h +++ b/src/core/include/mp-units/bits/quantity_concepts.h @@ -37,6 +37,10 @@ namespace detail { template void to_base_specialization_of_quantity(const volatile quantity*); +template +inline constexpr bool is_derived_from_specialization_of_quantity = + requires(T* t) { to_base_specialization_of_quantity(t); }; + } // namespace detail /** @@ -45,7 +49,7 @@ void to_base_specialization_of_quantity(const volatile quantity*); * Satisfied by all types being a either specialization or derived from `quantity` */ template -concept Quantity = requires(T* t) { detail::to_base_specialization_of_quantity(t); }; +concept Quantity = detail::is_derived_from_specialization_of_quantity; /** * @brief A concept matching all quantities with provided dimension or quantity spec diff --git a/src/core/include/mp-units/bits/quantity_point_concepts.h b/src/core/include/mp-units/bits/quantity_point_concepts.h index 75b6c2bf..184864c9 100644 --- a/src/core/include/mp-units/bits/quantity_point_concepts.h +++ b/src/core/include/mp-units/bits/quantity_point_concepts.h @@ -81,7 +81,11 @@ template void to_base_specialization_of_quantity_point(const volatile quantity_point*); template - requires requires(T* t) { detail::to_base_specialization_of_quantity_point(t); } +inline constexpr bool is_derived_from_specialization_of_quantity_point = + requires(T* t) { to_base_specialization_of_quantity_point(t); }; + +template + requires is_derived_from_specialization_of_quantity_point inline constexpr bool is_quantity_point = true; } // namespace detail diff --git a/src/core/include/mp-units/bits/quantity_spec_concepts.h b/src/core/include/mp-units/bits/quantity_spec_concepts.h index c74f565a..27838524 100644 --- a/src/core/include/mp-units/bits/quantity_spec_concepts.h +++ b/src/core/include/mp-units/bits/quantity_spec_concepts.h @@ -56,6 +56,10 @@ template void to_base_specialization_of_quantity_spec(const volatile quantity_spec*); #endif +template +inline constexpr bool is_derived_from_specialization_of_quantity_spec = + requires(T* t) { to_base_specialization_of_quantity_spec(t); }; + #ifdef __cpp_explicit_this_parameter template template @@ -65,6 +69,10 @@ template void to_base_specialization_of_base_quantity_spec(const volatile quantity_spec*); #endif +template +inline constexpr bool is_derived_from_specialization_of_base_quantity_spec = + requires(T* t) { to_base_specialization_of_base_quantity_spec(t); }; + template inline constexpr bool is_specialization_of_quantity_spec = false; @@ -82,7 +90,7 @@ inline constexpr bool is_specialization_of_quantity_spec -concept NamedQuantitySpec = requires(T* t) { to_base_specialization_of_quantity_spec(t); } && +concept NamedQuantitySpec = is_derived_from_specialization_of_quantity_spec && (!is_specialization_of_quantity_spec)&&(!QuantityKindSpec); /** @@ -92,7 +100,7 @@ concept NamedQuantitySpec = requires(T* t) { to_base_specialization_of_quantity_ * as a template parameter. */ template -concept BaseQuantitySpec = NamedQuantitySpec && requires(T* t) { to_base_specialization_of_base_quantity_spec(t); }; +concept BaseQuantitySpec = NamedQuantitySpec && is_derived_from_specialization_of_base_quantity_spec; template struct is_dimensionless : std::false_type {}; diff --git a/src/core/include/mp-units/bits/unit_concepts.h b/src/core/include/mp-units/bits/unit_concepts.h index bc4154ee..9acbe189 100644 --- a/src/core/include/mp-units/bits/unit_concepts.h +++ b/src/core/include/mp-units/bits/unit_concepts.h @@ -68,10 +68,11 @@ inline constexpr bool is_specialization_of_named_unit -concept NamedUnit = Unit && detail::is_derived_from_specialization_of_named_unit; +concept NamedUnit = + Unit && detail::is_derived_from_specialization_of_named_unit && (!detail::is_specialization_of_named_unit); } // namespace detail