diff --git a/src/include/units/physical/dimensions.h b/src/include/units/physical/dimensions.h index 2b3b1ffa..c14d8f71 100644 --- a/src/include/units/physical/dimensions.h +++ b/src/include/units/physical/dimensions.h @@ -23,23 +23,32 @@ #pragma once #include +#include #include #include +#include #include #include +#include namespace units::physical { namespace detail { -template typename DimTemplate, typename Child, Unit U, Exponent... Es> - requires requires { typename DimTemplate; } -void to_base_derived_dimension_of(const volatile derived_dimension*); +template typename DimTemplate> +inline constexpr bool same_exponents_of = false; + +template typename DimTemplate> +inline constexpr bool same_exponents_of, DimTemplate> = requires { typename DimTemplate, unknown_coherent_unit, typename Es::dimension...>; } && std::same_as, typename DimTemplate, unknown_coherent_unit, typename Es::dimension...>::recipe>; } // namespace detail template typename DimTemplate> -concept DimensionOf = Dimension && (is_derived_from_specialization_of || requires(const volatile Dim* x) { detail::to_base_derived_dimension_of(x); }); +concept EquivalentUnknownDimensionOf = Dimension && is_derived_from_specialization_of && detail::same_exponents_of; + +template typename DimTemplate> +concept DimensionOf = Dimension && (is_derived_from_specialization_of || + EquivalentUnknownDimensionOf); template typename DimTemplate> concept QuantityOf = Quantity && DimensionOf;