diff --git a/src/core/include/mp-units/framework/unit.h b/src/core/include/mp-units/framework/unit.h index f8263f75..5b9463a3 100644 --- a/src/core/include/mp-units/framework/unit.h +++ b/src/core/include/mp-units/framework/unit.h @@ -750,6 +750,16 @@ template return get_common_unit(cu, nu); } +template + requires(interconvertible(common_unit{}, common_unit{})) +[[nodiscard]] consteval Unit auto get_common_unit(common_unit, common_unit) +{ + if constexpr (sizeof...(Rest) == 1) + return get_common_unit(Front{}, get_common_unit(Rest{}..., common_unit{})); + else + return get_common_unit(Front{}, get_common_unit(common_unit{}, common_unit{})); +} + [[nodiscard]] consteval Unit auto get_common_unit(Unit auto u1, Unit auto u2, Unit auto u3, Unit auto... rest) requires requires { get_common_unit(get_common_unit(u1, u2), u3, rest...); } { diff --git a/test/static/unit_test.cpp b/test/static/unit_test.cpp index 661d85d4..e0cb58e5 100644 --- a/test/static/unit_test.cpp +++ b/test/static/unit_test.cpp @@ -67,6 +67,7 @@ inline constexpr struct pascal_ final : named_unit<"Pa", newton / square(metre)> inline constexpr struct joule_ final : named_unit<"J", newton * metre> {} joule; inline constexpr struct watt_ final : named_unit<"W", joule / second> {} watt; inline constexpr struct degree_Celsius_ final : named_unit {} degree_Celsius; +inline constexpr struct degree_Fahrenheit_ final : named_unit * degree_Celsius> {} degree_Fahrenheit; inline constexpr struct minute_ final : named_unit<"min", mag<60> * second> {} minute; inline constexpr struct hour_ final : named_unit<"h", mag<60> * minute> {} hour; @@ -568,6 +569,11 @@ static_assert(is_of_type>); static_assert(is_of_type>); +static_assert( + is_of_type>); +static_assert(is_of_type* degree_Celsius, si::milli)), + common_unit>>); static_assert( is_of_type, mile_>, per>>);