рдЯрд╛рдЗрдк-рд░рд┐рдЪ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

рд╕рдореНрдореЗрд▓рди рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, GoingNative 2012 рдиреЗ C ++ 11-рд╢реИрд▓реА рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП "рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕" рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдЬреЛ рд▓реЛрдЧ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ,
рдЕрдХреНрд╕рд░, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдпрд╛ рд╡рд┐рдзрд┐ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмреБрд░рд╛ рд╣реИ, рдЕрдЧрд░ рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрд╣ рд╕рд┐рд░реНрдл рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рд╣реИред

рдЦрд░рд╛рдм рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА


void increase_speed(double); Rectangle(int,int,int,int); 

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрдХреБрдЫ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд┐ рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдЧрддрд┐ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ? рдЧрддрд┐ рд╡реГрджреНрдзрд┐ рдХреЛ рдХрд┐рд╕ рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИ?
4 рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдпрдд ctor рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реИред рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдпрдд рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЪреМрдбрд╝рд╛рдИ рдпрд╛ рджреВрд╕рд░реЗ рдмрд┐рдВрджреБ рдХрд╛ x- рд╕рдордиреНрд╡рдп рд╣реИ? рдЦреИрд░, рдЖрджрд┐ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рдЯрд╛рдЗрдкреНрд╕ рдпрд╛ рдЯрд╛рдЗрдкреЗрдбрд┐рдлреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо increase_speed рдирд╣реАрдВ рд▓рд┐рдЦ рдкрд╛рдПрдВрдЧреЗ, рдЬреЛ рдХрд┐ m / s рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ increase_speed рдХрд╛ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг, рдЬреЛ рдХрд┐рдореА / рдШрдВрдЯрд╛ рд▓реЗрддрд╛ рд╣реИред рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдмрдврд╝реЗрдЧрд╛_рд╕реНрдкреАрдб (рдбрдмрд▓)ред

рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк


 void increase_speed(Speed); //         Rectangle(Point topLeft, BoxWH b); // ,           . 

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдЗрдпреЛрдВ рдФрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд╣реБрдИ рд╣реИред рдЖрдЗрдП рдПрд╕рдЖрдИ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдмрдЪрдд рдЬрд╛рдирдХрд╛рд░реА

рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдорд╛рдк (рдореАрдЯрд░, рдХрд┐рд▓реЛрдЧреНрд░рд╛рдо, рд╕реЗрдХрдВрдб) рдХреА рд╕рдВрдЧрдд рдмреБрдирд┐рдпрд╛рджреА рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЧреНрд░реА рд╣реЛрдЧреАред
 template<int M, int K, int S> class Unit { //   () public: enum { m = M, kg = K, s = S }; }; 

рдРрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ:
 template<typename Unit> struct Value { double val; // explicit Value(double d) : val(d) {} public: /* * -    */ static constexpr int m() {return Unit::m;}; static constexpr int kg() {return Unit::kg;}; static constexpr int s() {return Unit::s;}; }; typedef Value<Unit<1, 0, -1> > Speed; //  = / typedef Value<Unit<1, 0, -2> > Acceleration; //  = // typedef Unit<1, 0, 0> M; typedef Unit<0, 0, 1> S; 

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 Acceleration acc1 = Value<Unit<1, 0, -2> >(2); //  = 2 //.  . Acceleration acc2 = Value<M >(2); //  . Speed sp1 = Value<Unit<1, 0, -2> >(2); //  . Speed sp2 = Value<Unit<1, 0, -1> >(2); //  = 2 /.  . 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрд╕реБрд╡рд┐рдзрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдореВрд▓реНрдп рд╡рд░реНрдЧ рдХреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╛рдиреА рдЬрдм рддрдХ рд╣рдо рд╕реЗрдХрдВрдб рд╕реЗ рдореАрдЯрд░ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдбрд┐рд╡реАрдЬрди рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рд╢реЗрд╖ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдпреВрдирд┐рдЯ рдбрд┐рд╡реАрдЬрди рдСрдкрд░реЗрдЯрд░

 template<class Value1, class Value2> auto operator/(Value1 v1, Value2 v2) -> Value<Unit<Value1::m() - Value2::m(), Value1::kg() - Value2::kg(), Value1::s() - Value2::s()> > { return Value<Unit<Value1::m() - Value2::m(), Value1::kg() - Value2::kg(), Value1::s() - Value2::s()> >(v1.val / v2.val); 

рдЕрдм рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдорд╛рдиреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 Acceleration acc = Value<M>(100) / Value<S>(10) / Value<S>(1); //  = 10 //.  . Speed sp = Value<M>(100) / Value<S>(20); //  = 5 /.  . 


рдирд┐рд╖реНрдХрд░реНрд╖


рдХреНрдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЬрд╛рдБрдЪ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдкрд░рд┐ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рднреА рдЬрд╛рдБрдЪ рд╕рдВрдХрд▓рди рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЧрддрд┐ рдХреЛ рдХрд┐рдореА / рдШрдВрдЯрд╛ рд╕реЗ рдПрдо / рдПрд╕ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлреЙрд░реНрдо рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
 Speed convertSpeed(KmPerHour val); 
, рдЬрд╣рд╛рдВ KmPerHour рд╡рд░реНрдЧ, рдкреНрд░рд╛рдердорд┐рдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдХрдиреНрд╡рд░реНрдЯрд╕реНрдкреАрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдзрд┐рднрд╛рд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдиреЗ рдЕрдиреВрдареЗ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╕рдВрдЪрд╛рд▓рди (ConvertSpeed тАЛтАЛ(KmPerHour) рдФрд░ ConvertSpeed тАЛтАЛ(KmPerSec) рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред
рдХреЛрдб рдХреЛ gcc 4.6.3 рдкрд░ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдкреБрдирд╢реНрдЪ: рдорд╛рдирдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рд╕рдВрд╕реНрдХрд░рдг 4.7 рд╕реЗ gcc рдореЗрдВ), рдЬреЛ рдирд┐рдореНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛:
 Speed sp =100m/20s; //    operator"" s(double)  operator"" d(double). 

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЕрджреНрдпрддрди: рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рд╕рдВрджреЗрд╢ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрддреНрддреАрд░реНрдг рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд▓рд╕реА рд╣реЛрдирд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЬрд╛рдВрдЪреЗрдВред

Source: https://habr.com/ru/post/In144334/


All Articles