diff --git a/src/shared/units/Angle.h b/src/shared/units/Angle.h index 411296dfc0b60d66f1ad737d1ffad3bc0445d4e9..dbc26b1fcd6a7adcb1bab318ad91543fb413f897 100644 --- a/src/shared/units/Angle.h +++ b/src/shared/units/Angle.h @@ -34,10 +34,7 @@ namespace Angle { template <class Ratio = std::ratio<1>> -class Angle : public Unit<Ratio> -{ - using Unit<Ratio>::Unit; -}; +using Angle = Unit<UnitKind::Angle, Ratio>; using Degree = Angle<>; // Angle in degrees using Radian = // Angle in radians diff --git a/src/shared/units/Units.h b/src/shared/units/Units.h index dd080649b8b0d8f79069a817e293c7aeed45406a..20499a3b62c8ff55c840c8c1e70e3f653d9d483b 100644 --- a/src/shared/units/Units.h +++ b/src/shared/units/Units.h @@ -32,14 +32,20 @@ namespace Boardcore namespace Units { -template <class Ratio = std::ratio<1>> +enum class UnitKind +{ + Angle, + Length +}; + +template <UnitKind Kind, class Ratio = std::ratio<1>> // Base class to implement custom measurement units logic. class Unit { public: Unit(float val) : _value(val){}; template <class FromRatio> - constexpr explicit Unit(Unit<FromRatio> const &from) + constexpr explicit Unit(Unit<Kind, FromRatio> const &from) : _value(from.template value<Ratio>()) { } @@ -67,10 +73,11 @@ private: }; // Sum, Subtraction, Multiplication, Division -template <class DerivedUnit> -constexpr auto operator+(const DerivedUnit &lhs, const DerivedUnit &rhs) +template <UnitKind Kind, class Ratio> +constexpr auto operator+(const Unit<Kind, Ratio> &lhs, + const Unit<Kind, Ratio> &rhs) { - return DerivedUnit(lhs.template value() + rhs.template value()); + return Unit(lhs.template value() + rhs.template value()); } template <class DerivedUnit>