feat: quantity and quantity_point conversion operators now can also convert to const references

This commit is contained in:
Mateusz Pusz
2023-09-30 22:14:20 -06:00
parent 0999274680
commit b12b9f87ae
2 changed files with 12 additions and 7 deletions

View File

@@ -143,7 +143,7 @@ public:
quantity& operator=(const quantity&) = default;
quantity& operator=(quantity&&) = default;
// conversions
// unit conversions
template<UnitCompatibleWith<unit, quantity_spec> U>
requires detail::QuantityConvertibleTo<quantity, quantity<detail::make_reference(quantity_spec, U{}), Rep>>
[[nodiscard]] constexpr Quantity auto in(U) const
@@ -192,7 +192,8 @@ public:
}
// conversion operators
template<QuantityLike Q>
template<typename Q>
requires QuantityLike<std::remove_cvref_t<Q>>
[[nodiscard]] explicit(is_specialization_of<decltype(quantity_like_traits<Q>::from_numerical_value(numerical_value_)),
convert_explicitly>) constexpr
operator Q() const& noexcept(noexcept(quantity_like_traits<Q>::from_numerical_value(numerical_value_)) &&
@@ -201,11 +202,12 @@ public:
return quantity_like_traits<Q>::from_numerical_value(numerical_value_).value;
}
template<QuantityLike Q>
template<typename Q>
requires QuantityLike<std::remove_cvref_t<Q>>
[[nodiscard]] explicit(is_specialization_of<decltype(quantity_like_traits<Q>::from_numerical_value(numerical_value_)),
convert_explicitly>) constexpr
operator Q() && noexcept(noexcept(quantity_like_traits<Q>::from_numerical_value(numerical_value_)) &&
std::is_nothrow_move_constructible_v<rep>)
std::is_nothrow_move_constructible_v<rep>)
{
return quantity_like_traits<Q>::from_numerical_value(std::move(numerical_value_)).value;
}

View File

@@ -170,6 +170,7 @@ public:
return *this - PO2{};
}
// unit conversions
template<UnitCompatibleWith<unit, quantity_spec> U>
requires detail::QuantityConvertibleTo<quantity_type, quantity<detail::make_reference(quantity_spec, U{}), Rep>>
[[nodiscard]] constexpr QuantityPoint auto in(U) const
@@ -185,7 +186,8 @@ public:
}
// conversion operators
template<QuantityPointLike QP>
template<typename QP>
requires QuantityPointLike<std::remove_cvref_t<QP>>
[[nodiscard]] explicit(
is_specialization_of<decltype(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)),
convert_explicitly>) constexpr
@@ -195,12 +197,13 @@ public:
return quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_).value;
}
template<QuantityPointLike QP>
template<typename QP>
requires QuantityPointLike<std::remove_cvref_t<QP>>
[[nodiscard]] explicit(
is_specialization_of<decltype(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)),
convert_explicitly>) constexpr
operator QP() && noexcept(noexcept(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)) &&
std::is_nothrow_move_constructible_v<rep>)
std::is_nothrow_move_constructible_v<rep>)
{
return quantity_point_like_traits<QP>::from_quantity(std::move(quantity_from_origin_)).value;
}