diff --git a/wpimath/src/main/native/include/units/formatter.h b/wpimath/src/main/native/include/units/formatter.h index a43614bdb2..1c17b0a185 100644 --- a/wpimath/src/main/native/include/units/formatter.h +++ b/wpimath/src/main/native/include/units/formatter.h @@ -4,41 +4,41 @@ #pragma once +#include + #include #include "units/base.h" +// FIXME: Replace enable_if with requires clause and remove +// include once using GCC >= 12. GCC 11 incorrectly emits a struct redefinition +// error because it doesn't use the requires clause to disambiguate. + /** * Formatter for unit types. - * - * @tparam Units Unit tag for which type of units the `unit_t` represents (e.g. - * meters). - * @tparam T Underlying type of the storage. Defaults to double. - * @tparam NonLinearScale Optional scale class for the units. Defaults to linear - * (i.e. does not scale the unit value). Examples of - * non-linear scales could be logarithmic, decibel, or - * richter scales. Non-linear scales must adhere to the - * non-linear-scale concept. */ -template class NonLinearScale> -struct fmt::formatter> - : fmt::formatter { +template +struct fmt::formatter>> { + constexpr auto parse(fmt::format_parse_context& ctx) { + return m_underlying.parse(ctx); + } + /** * Writes out a formatted unit. * * @param obj Unit instance. * @param ctx Format string context. */ - auto format(const units::unit_t& obj, - fmt::format_context& ctx) const { + auto format(const Unit& obj, fmt::format_context& ctx) const { + using Units = typename Unit::unit_type; using BaseUnits = units::unit, typename units::traits::unit_traits::base_unit_type>; auto out = ctx.out(); - out = fmt::formatter::format( - units::convert(obj()), ctx); + out = m_underlying.format(units::convert(obj()), ctx); if constexpr (units::traits::unit_traits< Units>::base_unit_type::meter_ratio::num != 0) { @@ -213,4 +213,7 @@ struct fmt::formatter> return out; } + + private: + fmt::formatter m_underlying; };