From 8e1539bf2257b66693baef79b8d67da132a7539c Mon Sep 17 00:00:00 2001 From: "Ralph J. Steinhagen" Date: Sun, 27 Jun 2021 13:42:55 +0200 Subject: [PATCH] added inheritance unit-test and made is_quantity more specific --- src/core/include/units/bits/basic_concepts.h | 2 +- src/core/include/units/quantity.h | 11 +++++++++++ test/unit_test/static/quantity_test.cpp | 12 ++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/core/include/units/bits/basic_concepts.h b/src/core/include/units/bits/basic_concepts.h index 94425df1..4ec56115 100644 --- a/src/core/include/units/bits/basic_concepts.h +++ b/src/core/include/units/bits/basic_concepts.h @@ -269,7 +269,7 @@ concept Reference = detail::is_reference; namespace detail { template -inline constexpr bool is_quantity = requires { typename T::dimension; typename T::unit; typename T::rep;}; +inline constexpr bool is_quantity = false; template inline constexpr bool is_quantity_point = false; diff --git a/src/core/include/units/quantity.h b/src/core/include/units/quantity.h index 03140500..7956cd11 100644 --- a/src/core/include/units/quantity.h +++ b/src/core/include/units/quantity.h @@ -460,6 +460,17 @@ namespace detail { template inline constexpr bool is_quantity> = true; +template +requires units::is_derived_from_specialization_of && + requires { + typename T::dimension; + typename T::unit; + typename T::rep; + requires Dimension; + requires Unit; + requires Representation; } +inline constexpr bool is_quantity = true; + } // namespace detail } // namespace units diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index de56d789..c0b458f6 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -234,6 +234,18 @@ static_assert(length(2_q_km).number() == 2); static_assert(length(2_q_km).number() == 2000); static_assert(length(1500_q_m).number() == 1.5); +/////////////////////////////////////// +// derived quantities +/////////////////////////////////////// + +template +struct derived_quantity : quantity { + using dimension = typename Q::dimension; + using unit = typename Q::unit; + using rep = Rep; +}; + +static_assert(units::detail::is_quantity, "NTTP type description">>); ///////// // CTAD