feat: overloads with static_assert added to improve migration

This commit is contained in:
Mateusz Pusz
2024-06-22 18:39:10 +02:00
parent 9d57cf2758
commit 2c578d92df
2 changed files with 31 additions and 0 deletions

View File

@@ -166,6 +166,14 @@ public:
{ {
} }
template<typename Value, Reference R2>
requires(!DeltaReference<R2>)
constexpr quantity(Value&&, R2)
{
static_assert(false,
"References using offset units (e.g., temperatures) must be explicitly qualified with `delta`");
}
template<detail::QuantityConvertibleTo<quantity> Q> template<detail::QuantityConvertibleTo<quantity> Q>
// NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions) // NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions)
constexpr explicit(!std::convertible_to<typename Q::rep, Rep>) quantity(const Q& q) : constexpr explicit(!std::convertible_to<typename Q::rep, Rep>) quantity(const Q& q) :
@@ -433,6 +441,11 @@ template<typename Value, DeltaReference R>
requires RepresentationOf<Value, get_quantity_spec(detail::get_original_reference(R{})).character> requires RepresentationOf<Value, get_quantity_spec(detail::get_original_reference(R{})).character>
quantity(Value v, R) -> quantity<detail::get_original_reference(R{}), Value>; quantity(Value v, R) -> quantity<detail::get_original_reference(R{}), Value>;
// the below is needed only to fire static_asserts in the constructor
template<typename Value, Reference R>
requires(!DeltaReference<R>) && RepresentationOf<Value, get_quantity_spec(R{}).character>
quantity(Value v, R) -> quantity<R{}, Value>;
template<QuantityLike Q> template<QuantityLike Q>
explicit( explicit(
is_specialization_of<decltype(quantity_like_traits<Q>::to_numerical_value(std::declval<Q>())), convert_explicitly>) is_specialization_of<decltype(quantity_like_traits<Q>::to_numerical_value(std::declval<Q>())), convert_explicitly>)

View File

@@ -219,6 +219,24 @@ operator/(Rep&& lhs, R)
return quantity_point{std::forward<Rep>(lhs) * delta<inverse(detail::get_original_reference(R{}))>}; return quantity_point{std::forward<Rep>(lhs) * delta<inverse(detail::get_original_reference(R{}))>};
} }
template<typename Rep, Reference R>
requires(!DeltaReference<R>) && RepresentationOf<std::remove_cvref_t<Rep>, get_quantity_spec(R{}).character>
[[noreturn]] constexpr auto operator*(Rep&&, R)
{
static_assert(
false,
"References using offset units (e.g., temperatures) must be explicitly qualified with `delta` or `absolute`");
}
template<typename Rep, Reference R>
requires(!DeltaReference<R>) && RepresentationOf<std::remove_cvref_t<Rep>, get_quantity_spec(R{}).character>
[[noreturn]] constexpr auto operator/(Rep&&, R)
{
static_assert(
false,
"References using offset units (e.g., temperatures) must be explicitly qualified with `delta` or `absolute`");
}
template<Reference R, typename Rep> template<Reference R, typename Rep>
requires RepresentationOf<std::remove_cvref_t<Rep>, get_quantity_spec(R{}).character> requires RepresentationOf<std::remove_cvref_t<Rep>, get_quantity_spec(R{}).character>
// NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward) // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)