From 2328a26992a2f67775afbabbf2f33af277d1cfda Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sat, 9 Nov 2019 14:42:06 +0000 Subject: [PATCH] Downcasting support added to `quantity_cast` (resolves #26) --- src/include/units/quantity.h | 13 ++++++++----- test/unit_test/static/quantity_test.cpp | 3 +++ 2 files changed, 11 insertions(+), 5 deletions(-) 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);