diff --git a/src/include/units/bits/equivalent.h b/src/include/units/bits/equivalent.h index 39d7784c..898e6426 100644 --- a/src/include/units/bits/equivalent.h +++ b/src/include/units/bits/equivalent.h @@ -33,24 +33,24 @@ template struct equivalent_impl : std::false_type { }; +template +struct equivalent_impl : std::true_type { +}; + + // units template -struct equivalent_impl : std::disjunction, std::is_base_of, std::is_base_of> {}; +struct equivalent_impl : std::is_base_of, std::is_base_of {}; // dimensions template -struct equivalent_base_dim : - std::conjunction, +struct equivalent_impl : std::conjunction, same_unit_reference> { }; -template -struct equivalent_impl : std::disjunction, equivalent_base_dim> { -}; - template struct equivalent_exp : std::false_type { }; @@ -71,7 +71,7 @@ struct equivalent_derived_dim, derived_dimension_ template struct equivalent_impl : - std::disjunction, std::is_base_of, std::is_base_of, + std::disjunction, std::is_base_of, equivalent_derived_dim, downcast_base_t>> { }; @@ -85,10 +85,9 @@ struct equivalent_unit : std::disjunction, template requires (Quantity && Quantity) || (QuantityPoint && QuantityPoint) -struct equivalent_impl : std::disjunction, - std::conjunction, - equivalent_unit>> {}; +struct equivalent_impl : std::conjunction, + equivalent_unit> {}; } // namespace detail diff --git a/src/include/units/quantity.h b/src/include/units/quantity.h index 58e3b991..6a7e4f63 100644 --- a/src/include/units/quantity.h +++ b/src/include/units/quantity.h @@ -133,7 +133,8 @@ public: quantity(quantity&&) = default; template Value> - explicit(!(equivalent>)) constexpr quantity(const Value& v) : value_(static_cast(v)) {} + explicit(!(is_same_v && is_same_v)) + constexpr quantity(const Value& v) : value_(static_cast(v)) {} template requires std::same_as> diff --git a/test/unit_test/static/test_tools.h b/test/unit_test/static/test_tools.h index 4d9dc1de..e4f7975e 100644 --- a/test/unit_test/static/test_tools.h +++ b/test/unit_test/static/test_tools.h @@ -25,7 +25,14 @@ #include "units/bits/equivalent.h" template -inline constexpr bool compare_impl = UNITS_DOWNCAST_MODE != 0 ? std::is_same_v : (std::is_same_v || units::equivalent); +inline constexpr bool compare_impl = false; + +template +inline constexpr bool compare_impl = true; + +template + requires (UNITS_DOWNCAST_MODE == 0) +inline constexpr bool compare_impl = units::equivalent; template inline constexpr bool compare = compare_impl, std::remove_cvref_t>;