diff --git a/src/core/include/mp-units/framework/quantity.h b/src/core/include/mp-units/framework/quantity.h index 81b98217..1017693b 100644 --- a/src/core/include/mp-units/framework/quantity.h +++ b/src/core/include/mp-units/framework/quantity.h @@ -463,9 +463,9 @@ public: } // binary operators on quantities - template Q, auto R2, typename Rep2> + template requires detail::CommonlyInvocableQuantities, quantity, quantity> - [[nodiscard]] friend constexpr Quantity auto operator+(const Q& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr Quantity auto operator+(const quantity& lhs, const quantity& rhs) { using ret = detail::common_quantity_for, quantity, quantity>; const ret ret_lhs(lhs); @@ -474,9 +474,9 @@ public: ret::reference}; } - template Q, auto R2, typename Rep2> + template requires detail::CommonlyInvocableQuantities, quantity, quantity> - [[nodiscard]] friend constexpr Quantity auto operator-(const Q& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr Quantity auto operator-(const quantity& lhs, const quantity& rhs) { using ret = detail::common_quantity_for, quantity, quantity>; const ret ret_lhs(lhs); @@ -485,10 +485,10 @@ public: ret::reference}; } - template Q, auto R2, typename Rep2> + template requires(!treat_as_floating_point) && (!treat_as_floating_point) && detail::CommonlyInvocableQuantities, quantity, quantity> - [[nodiscard]] friend constexpr Quantity auto operator%(const Q& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr Quantity auto operator%(const quantity& lhs, const quantity& rhs) { MP_UNITS_EXPECTS_DEBUG(rhs != rhs.zero()); using ret = detail::common_quantity_for, quantity, quantity>; @@ -498,61 +498,61 @@ public: ret::reference}; } - template Q, auto R2, typename Rep2> + template requires detail::InvocableQuantities, quantity, quantity> - [[nodiscard]] friend constexpr Quantity auto operator*(const Q& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr Quantity auto operator*(const quantity& lhs, const quantity& rhs) { return ::mp_units::quantity{lhs.numerical_value_ref_in(get_unit(R)) * rhs.numerical_value_ref_in(get_unit(R2)), R * R2}; } - template Q, typename Value> + template requires(!Quantity) && (!Reference) && detail::InvokeResultOf, Rep, const Value&> - [[nodiscard]] friend constexpr QuantityOf auto operator*(const Q& q, const Value& v) + [[nodiscard]] friend constexpr QuantityOf auto operator*(const quantity& q, const Value& v) { return ::mp_units::quantity{q.numerical_value_ref_in(get_unit(R)) * v, R}; } - template Q> + template requires(!Quantity) && (!Reference) && detail::InvokeResultOf, const Value&, Rep> - [[nodiscard]] friend constexpr QuantityOf auto operator*(const Value& v, const Q& q) + [[nodiscard]] friend constexpr QuantityOf auto operator*(const Value& v, const quantity& q) { return ::mp_units::quantity{v * q.numerical_value_ref_in(get_unit(R)), R}; } - template Q, auto R2, typename Rep2> + template requires detail::InvocableQuantities, quantity, quantity> - [[nodiscard]] friend constexpr Quantity auto operator/(const Q& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr Quantity auto operator/(const quantity& lhs, const quantity& rhs) { MP_UNITS_EXPECTS_DEBUG(rhs != rhs.zero()); return ::mp_units::quantity{lhs.numerical_value_ref_in(get_unit(R)) / rhs.numerical_value_ref_in(get_unit(R2)), R / R2}; } - template Q, typename Value> + template requires(!Quantity) && (!Reference) && detail::InvokeResultOf, Rep, const Value&> - [[nodiscard]] friend constexpr QuantityOf auto operator/(const Q& q, const Value& v) + [[nodiscard]] friend constexpr QuantityOf auto operator/(const quantity& q, const Value& v) { MP_UNITS_EXPECTS_DEBUG(v != quantity_values::zero()); return ::mp_units::quantity{q.numerical_value_ref_in(get_unit(R)) / v, R}; } - template Q> + template requires(!Quantity) && (!Reference) && detail::InvokeResultOf, const Value&, Rep> [[nodiscard]] friend constexpr QuantityOf auto operator/(const Value& v, - const Q& q) + const quantity& q) { return ::mp_units::quantity{v / q.numerical_value_ref_in(get_unit(R)), ::mp_units::one / R}; } - template Q, auto R2, typename Rep2> + template requires requires { typename std::common_type_t>; } && std::equality_comparable>::rep> - [[nodiscard]] friend constexpr bool operator==(const Q& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr bool operator==(const quantity& lhs, const quantity& rhs) { using ct = std::common_type_t>; const ct ct_lhs(lhs); @@ -560,10 +560,10 @@ public: return ct_lhs.numerical_value_ref_in(ct::unit) == ct_rhs.numerical_value_ref_in(ct::unit); } - template Q, auto R2, typename Rep2> + template requires requires { typename std::common_type_t>; } && std::three_way_comparable>::rep> - [[nodiscard]] friend constexpr auto operator<=>(const Q& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr auto operator<=>(const quantity& lhs, const quantity& rhs) { using ct = std::common_type_t>; const ct ct_lhs(lhs);