diff --git a/src/core/include/mp-units/framework/reference.h b/src/core/include/mp-units/framework/reference.h index 9cb269ac..f0721d84 100644 --- a/src/core/include/mp-units/framework/reference.h +++ b/src/core/include/mp-units/framework/reference.h @@ -198,6 +198,26 @@ template return quantity{std::forward(lhs), relative(inverse(detail::get_original_reference(R{})))}; } +template + requires RepresentationOf, get_quantity_spec(detail::get_original_reference(R{})).character> +[[nodiscard]] constexpr quantity_point> +operator*(Rep&& lhs, R) +{ + return quantity_point{std::forward(lhs) * relative(detail::get_original_reference(R{}))}; +} + +template + requires RepresentationOf, get_quantity_spec(detail::get_original_reference(R{})).character> +[[nodiscard]] constexpr quantity_point> +operator/(Rep&& lhs, R) +{ + return quantity_point{std::forward(lhs) * relative(inverse(detail::get_original_reference(R{})))}; +} + template requires RepresentationOf, get_quantity_spec(R{}).character> // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward) diff --git a/test/static/quantity_point_test.cpp b/test/static/quantity_point_test.cpp index 758f81b9..671f3527 100644 --- a/test/static/quantity_point_test.cpp +++ b/test/static/quantity_point_test.cpp @@ -801,9 +801,12 @@ static_assert( ////////////////////////////////// static_assert(quantity_point{42 * m}.quantity_from_zero() == 42 * m); +static_assert((42 * absolute(m)).quantity_from_zero() == 42 * m); static_assert(quantity_point{isq::height(42 * m)}.quantity_from_zero() == 42 * m); static_assert(quantity_point{20 * relative(deg_C)}.quantity_from_zero() == 20 * relative(deg_C)); +static_assert((20 * absolute(deg_C)).quantity_from_zero() == 20 * relative(deg_C)); static_assert(quantity_point{20. * relative(deg_C)}.in(deg_F).quantity_from_zero() == 68 * relative(deg_F)); +static_assert((20. * absolute(deg_C)).in(deg_F).quantity_from_zero() == 68 * relative(deg_F)); static_assert((mean_sea_level + 42 * m).quantity_from_zero() == 42 * m); static_assert((ground_level + 42 * m).quantity_from_zero() == 84 * m); @@ -889,13 +892,12 @@ static_assert(std::is_same_v); -static_assert(std::is_same_v, - struct si::ice_point>); -static_assert(std::is_same_v, +static_assert(std::is_same_v); +static_assert(std::is_same_v, struct si::ice_point>); +static_assert(std::is_same_v, struct si::absolute_zero>); -static_assert(quantity_point{20 * relative(deg_C)}.unit == si::degree_Celsius); -static_assert(quantity_point{20 * relative(deg_C)}.quantity_spec == kind_of); +static_assert((20 * absolute(deg_C)).unit == si::degree_Celsius); +static_assert((20 * absolute(deg_C)).quantity_spec == kind_of); #if MP_UNITS_HOSTED using namespace std::chrono_literals;