C ++, рдХреНрдпрд╛ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБрдУрдВ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдШреЛрд╖рдгрд╛

рдкрд┐рдЫрд▓реА рдмрд╛рд░ , рд╣рдордиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП SFINAE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ, рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ if constexpr рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдб рдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗ рдпрджрд┐ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рдЬрдмрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЕрднреА рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдФрд░ рддреНрдпрд╛рдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛) рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  • рд╣рд░ рдмрд╛рд░ рдЖрдкрдХреЛ рдПрдХ struct рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  • рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдЬрдм рдЖрдк рдЗрд╕реЗ рдПрдХ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрддрдорд╛рди рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдЙрд╕ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред
  • рдЖрдкрдХреЛ рдПрдХ рдЕрдпреЛрдЧреНрдп рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ struct рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред

рд╣рдо рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╕рднреА рддреАрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкрд╣рд▓реЗ рд╡рд╛рдВрдЫрд┐рдд рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВред



 // awesome.h namespace awesome { //      struct special { ... }; } //   namespace awesome { //   ,    struct special; } 

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдРрд╕рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдПрдХ struct рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред call_if_defined рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдирдИ рдШреЛрд╖рдгрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╣реА рдШреЛрд╖рд┐рдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИред рдФрд░ рдЬрдм рд╕реЗ рдЙрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрдк рдЙрд╕реЗ рдЙрд╕рдХреЗ рдЕрдпреЛрдЧреНрдп рдирд╛рдо, рдЙрд╕рдХреЗ рдкреВрд░реНрдг рдирд╛рдо рд╕реНрдерд╛рди рдпрд╛ рдмреАрдЪ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рдпрд╛ рдПрдХ рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡реЗ рдмреАрдЪ рдирд╣реАрдВ рд╣реИрдВ)ред

 namespace app { void foo() { call_if_defined<awesome::special>([&](auto* p) { //      "awesome::special" // .     "special" //     . using special = std::decay_t<decltype(*p)>; //      "special"   //   "awesome::special". special::do_something(); }); } } 

рдЬреЛ рд▓реЛрдЧ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ call_if_defined рдкрджреНрдзрддрд┐ рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреА рд╣реИ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛ред рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдкрд░ рд╣реА рд▓реИрдореНрдмрдбрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рдХрд░реАрдм рд╕реЗ рджреЗрдЦреЗрдВ:

 template<typename... T, typename TLambda> void call_if_defined(TLambda&& lambda) { if constexpr ((... && is_complete_type_v<T>)) { lambda(static_cast<T*>(nullptr)...); } } 

рдпрджрд┐ рдХреЛрд╖реНрдардХ (...) рдореЗрдВ рдбрдмрд▓ рдХреЛрд╖реНрдардХ рдЕрдЬреАрдм рд▓рдЧрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдмрд╛рд╣рд░реА рдХреЛрд╖реНрдардХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ if constexpr рджреНрд╡рд╛рд░рд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЖрдиреНрддрд░рд┐рдХ рдХреЛрд╖реНрдардХ рдПрдХ рдХрдирд╡рд▓реНрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ рд╣реИрдВред рд╕рдЬрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ

  if constexpr ( (is_complete_type_v<T1> && is_complete_type_v<T2> && ... is_complete_type_v<Tn>)) 

рд▓реИрдореНрдмреНрдбрд╛ рдХреЙрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

  lambda(static_cast<T*>(nullptr)...); 

рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИ

  lambda(static_cast<T1*>(nullptr), static_cast<T2*>(nullptr), ..., static_cast<Tn*>(nullptr)); 

рдЬрд╣рд╛рдВ static_cast<T*>(nullptr) рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ static_cast<T*>(nullptr) ред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реИрдореНрдмрдбрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ:

 void foo(Source const& source) { call_if_defined<special, magic>( [&](auto* p1, auto* p2) { using special = std::decay_t<decltype(*p1)>; using magic = std::decay_t<decltype(*p2)>; auto s = source.try_get<special>(); if (s) magic::add_magic(s); }); } 

C ++ 20 рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

 void foo(Source const& source) { call_if_defined<special, magic>( [&]<typename special, typename magic> (special*, magic*) { auto s = source.try_get<special>(); if (s) magic::add_magic(s); }); } 

рдЬреЛ рдЖрдкрдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ std::decay_t рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реБрдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ std::decay_t ред

рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧрдмреЛрд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рд░реНрдХрд┐рдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред



рдиреЛрдЯ : рдпрд╣ рд▓реЗрдЦреЛрдВ рдХреА рдореБрдЦреНрдп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЪреМрдерд╛ рднрд╛рдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЕрдиреНрдп рднрд╛рдЧ ( 1 , 2 , 3 , 5 ) рд╣реИрдВред рдЕрдзреАрд░ рдХреЗ рд▓рд┐рдП: рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 template<typename, typename = void> constexpr bool is_type_complete_v = false; template<typename T> constexpr bool is_type_complete_v <T, std::void_t<decltype(sizeof(T))>> = true; template<typename... T, typename TLambda> void call_if_defined(TLambda&& lambda) { if constexpr ((... && is_complete_type_v<T>)) { lambda(static_cast<T*>(nullptr)...); } } 

рд╡реИрд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рд╣реИ


рдПрдХ рджрд╢рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ, рд╣реЙрдХ рдЧреЗрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ 3 рдбреА рдореЗрдВ рдирд╡рд╛рдЪрд╛рд░ рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдЧреЗ рд╣реИред рдЕрдиреБрднреВрддрд┐ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, HoloLens рдЯреАрдо, рдЕрдм рд╣рдо рдЗрд╕ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдФрд░ Azure рдХреНрд▓рд╛рдЙрдб рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдХрдИ рд░реЛрдорд╛рдВрдЪрдХ рдирдИ рдорд┐рд╢реНрд░рд┐рдд-рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╕реЗрд╡рд╛рдПрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдШреЛрд╖рд┐рдд рдПрдЬрд╝реБрд░ рд░рд┐рдореЛрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реЗрд╡рд╛ рд╣реИред рд╣рдо рдПрдЖрд░, рд╡реАрдЖрд░ рдФрд░ рдХреНрд▓рд╛рдЙрдб рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рд╡реБрдХ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдорд┐рд╢реНрд░рд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╡реАрди рдкреНрд░рдерд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рд╣реЙрдХ рдореЗрдВ рдиреМрдХрд░рд┐рдпрд╛рдВ:

  • рдЖрдк рдкреНрд░рддрд┐рднрд╛рд╢рд╛рд▓реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЫреЛрдЯреА рдЯреАрдореЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ
  • рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдирдИ рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрдЧрд╛ред
  • рдЖрдк рдмрдбрд╝реА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рддрдХрдиреАрдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕реБрд▓рдЭрд╛рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ
  • рдЖрдк рджреБрдирд┐рдпрд╛ рднрд░ рдХреА рд╢рд╛рдВрдд рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдХрд░реНрддрд╡реНрдпреЛрдВ


  • рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛, рдХреБрд╢рд▓ рдФрд░ рд╕реНрд╡рдЪреНрдЫ рдмрд╣реБ-рдордВрдЪ C ++ рдХреЛрдб рдХрд╛ рдбрд┐рдЬрд╛рдЗрди, рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
  • рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдХреЗрд▓реЗрдмрд▓ рдПрдЬрд╝реНрдпреЛрд░ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░реЗрдВ
  • рдЙрддреНрдкрд╛рдж рд╡рд┐рдХрд╛рд╕ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░реЗрдВ

рдпреЛрдЧреНрдпрддрд╛


  • C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдХреМрд╢рд▓
  • рдПрдХ рдХреЙрдорди рдХреЛрдб рд╡рд╛рд▓реА рдЯреАрдо рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
  • рдХреНрд▓рд╛рдЙрдб рдФрд░ рд╡рд┐рддрд░рд┐рдд рд╕реЗрд╡рд╛ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ (рдЙрджрд╛ред Azure рдмреИрдЪ, Azure Blob Storage, Docker, Telemetry)

рдПрдХ рдкреНрд▓рд╕ рд╣реЛрдЧрд╛


  • C #, ASP.Net, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
  • рдПрдХрддрд╛, рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдЦреЗрд▓ рдЗрдВрдЬрди
  • рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ 3 рдбреА, рдПрдЖрд░ рдпрд╛ рд╡реАрдЖрд░ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░реЗрдВ
  • рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗрд╡рд╛рдПрдВ
  • рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди

рдЖрдк рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рдпрд╛ рд▓рд┐рдВрдХреНрдбрдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдЬрдорд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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


All Articles