diff --git a/src/include/units/quantity.h b/src/include/units/quantity.h index 812f7a57..67d93440 100644 --- a/src/include/units/quantity.h +++ b/src/include/units/quantity.h @@ -157,29 +157,32 @@ namespace units { } // namespace detail template - [[nodiscard]] constexpr To quantity_cast(const quantity& q) + [[nodiscard]] constexpr auto quantity_cast(const quantity& q) requires same_dim { using c_ratio = ratio_divide; using c_rep = std::common_type_t; - using cast = detail::quantity_cast_impl; + using ret_dim = downcast; + using ret_unit = downcast>; + using ret = quantity; + using cast = detail::quantity_cast_impl; return cast::cast(q); } template - [[nodiscard]] constexpr quantity quantity_cast(const quantity& q) + [[nodiscard]] constexpr auto quantity_cast(const quantity& q) { return quantity_cast>(q); } template - [[nodiscard]] constexpr quantity quantity_cast(const quantity& q) + [[nodiscard]] constexpr auto quantity_cast(const quantity& q) { return quantity_cast>(q); } template - [[nodiscard]] constexpr quantity quantity_cast(const quantity& q) + [[nodiscard]] constexpr auto quantity_cast(const quantity& q) { return quantity_cast>(q); } diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index 61e77dbf..532d7769 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -269,6 +269,9 @@ namespace { // quantity_cast + static_assert(std::is_same_v>>(2km))::unit, metre>); + static_assert(std::is_same_v>, ratio<1>>>(2km))::unit, metre>); + // static_assert(quantity_cast(2km).count() == 2000); // should not compile static_assert(quantity_cast>(2km).count() == 2000); static_assert(quantity_cast>(2000m).count() == 2);