рдЕрдХреНрд╕рд░, рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
long
) рдХреЛ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд▓реЛрдЧ рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЧрд▓рддреА рд╕реЗ рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЗрдХрд╛рдИ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЕрдВрддрд░рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╕реА ++ рд╣реИ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХрдерди
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЬреЗрдЯ (
Widget
рд╡рд░реНрдЧ) рдФрд░ рдЧреИрдЬреЗрдЯ (
Gadget
рд╡рд░реНрдЧ) рд▓реЗрдВ:
class Widget { public: long id() const;
рддреНрд░реБрдЯрд┐ рдХреА рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ "рдХрдЪреНрдЪреЗ" рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕реЗ
std::vector<long>
std::map<long, long>
ред рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рдирд╛рд░реНрдереА рд╢рдмреНрдж рдХрд╛ рдкреНрд░рдпреЛрдЧ:
typedef long WidgetId; typedef long GadgetId;
рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ
std::map<WidgetId, GadgetId>
рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗрд╡рд▓ рдкрдардиреАрдпрддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╣рдо
WidgetId
рдФрд░
GadgetId
рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрд╕рдВрдЧрдд
GadgetId
рд╣реИрдВред
рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╣рдорд╛рд░реЗ рдЗрд░рд╛рджреЗ рдмрддрд╛рддреЗ рд╣реИрдВ
рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЕрдореВрд░реНрдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рднреАрдбрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдЧрдЬрд╝ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд░рдЦрддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рднреНрд░рдорд┐рдд рди рд╣реЛрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ
рдкреНрд░рдХрд╛рд░ рдХрд╛ рд▓реЗрдмрд▓ рдЬреЛрдбрд╝рдирд╛ рд╣реИ - рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдпрд╛ рдкреНрд░рддреНрдпрдп рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдПрдХ рдкрд╣рдЪрд╛рди рдпреЛрдЧреНрдп рдЗрдХрд╛рдИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, K-12 рдХрд╛ рдорддрд▓рдм 12 рдиреМрдХрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ P-12 - рдмрд╛рд░рд╣рд╡реЗрдВ рдкрдВрдЬреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, C ++ рдореЗрдВ рдПрдХ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ - рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд▓реЗрдмрд▓ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реНрд░реЗрдгреАрдмрджреНрдз рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ:
template <typename ModelType, typename ReprType = long> class IdOf { public: typedef ModelType model_type; typedef ReprType repr_type; IdOf() : value_() {} explicit IdOf(repr_type value) : value_(value) {} repr_type value() const { return value_; } bool operator==(const IdOf &rhs) const { return value() == rhs.value(); } bool operator!=(const IdOf &rhs) const { return value() != rhs.value(); } bool operator<(const IdOf &rhs) const { return value() < rhs.value(); } bool operator>(const IdOf &rhs) const { return value() > rhs.value(); } private: repr_type value_; };
рд╣рдорд╛рд░реЗ рдЧреИрдЬреЗрдЯ рдФрд░ рд╡рд┐рдЬреЗрдЯ рдкрд░ рдирдИ рдХрдХреНрд╖рд╛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
class Gadget; class Widget; typedef IdOf<Gadget> GadgetId; typedef IdOf<Widget> WidgetId; class Widget { public: WidgetId id() const;
рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдордиреЗ
IdOf
рдХреНрд▓рд╛рд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ,
IdOf
рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рддрд╛рд░реНрдХрд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╡рд╛рд▓реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдкрд░ рдкрд░рд┐рдЪрд╛рд▓рди рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЕрдм рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдорд╛рд░реЗ рдЗрд░рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирддрд╛ рд╣реИ, рдпрд╣ рд╣рдореЗрдВ рд╡рд┐рдЬреЗрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЧреИрдЬреЗрдЯ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдпрд╛ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред
рдпрджрд┐ рд╣рдореЗрдВ рдЕрднреА рднреА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдпрд╛ рдХрдЪреНрдЪреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╣рдореЗрд╢рд╛
value()
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░реЗрдд рдкреНрд░рдХрд╛рд░
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдЯреНрд░рд┐рдХ рдХреЛ рд╣рдордиреЗ рдкрд╣рдЪрд╛рдирдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХреНрд░реИрдВрдХ рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ
рдлреИрдВрдЯрдо рдкреНрд░рдХрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдПрдХ рд╕рдорд╛рди рддрдХрдиреАрдХ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
newtype IdOf a = IdOf { idValue :: Int } deriving (Ord, Eq, Show, Read)
рд╡рд╛рд╣, рдХреЛрдб рдХреА рд╕рд┐рд░реНрдл рдПрдХ рджреЛ рд▓рд╛рдЗрдиреЗрдВ! рдЕрдм рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ:
data Widget = Widget { widgetId :: IdOf Widget } deriving (Show, Eq) data Gadget = Gadget { gadgetId :: IdOf Gadget } deriving (Show, Eq)
рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдХрд░ рдФрд░ рдЙрдирдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
Prelude> let g = Gadget (IdOf 5) Prelude> let w = Widget (IdOf 5) Prelude> widgetId w == gadgetId g <interactive>:1:15: Couldn't match type `Gadget' with `Widget' Expected type: IdOf Widget Actual type: IdOf Gadget In the return type of a call of `gadgetId' In the second argument of `(==)', namely `gadgetId g' In the expression: widgetId w == gadgetId g
рдЦреИрд░, рд╕рдВрдХрд▓рдХ (рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ, рдореИрдВрдиреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП ghci рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛) рдиреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрджреНрд░рд╛ рд▓реЗрдмрд▓, рдорд╛рдк рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ, рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХреЛ рдмрд╛рдБрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рд╕рдВрдХрд▓рдХ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдо
рдмрд╕ рдПрдХ рдЫреЛрдЯрд╛ рд╡рд░реНрдЧ рд╣рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдореЗрдВ рдЦрд░реНрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрдХреВрд▓рди рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдореЗрдореЛрд░реА рдЦрдкрдд рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд╕реНрдХреЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рдХреЛ рдЙрдХрд╕рд╛рддрд╛ рдирд╣реАрдВ рд╣реИред
рдиреБрдХрд╕рд╛рди рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ (рдФрд░ рдкрдврд╝рдиреЗ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░, рд╢рд╛рдпрдж, рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЛ рд╡рд┐рдЪрд╛рд░ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рддрд░реНрдХ рдХреА рдЕрдзрд┐рдХ рдХрдареЛрд░ рдЬрд╛рдВрдЪ рдХреЗ рдлрд╛рдпрджреЗ рдиреБрдХрд╕рд╛рди рдХреЛ рдкрдЫрд╛рдбрд╝ рджреЗрддреЗ рд╣реИрдВред
рдЙрдЪреНрдЪ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдкреНрд░реЗрдд рдкреНрд░рдХрд╛рд░ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВ, рдЬрд╣рд╛рдВ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдХрдВрдкрдиреА рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡реЗ рдЬреЗрди рд╕реНрдЯреНрд░реАрдЯ рдкрд░ рдУрдХреЗрдореЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╕реНрдЯреИрдВрдбрд░реНрдб рдЪрд╛рд░реНрдЯрд░реНрдб рдмреИрдВрдХ рдЙрддреНрдкрд╛рджреЛрдВ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐
рдбреЙрди рд╕реНрдЯреАрд╡рд░реНрдЯ рдиреЗ Google рдЯреЗрдХ рдЯреЙрдХ 2015 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдмрд╛рдд рдХреА рдереА )ред
рдХреЛрдИ рднреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА
Boost.Units рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред