C ++ 2a рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реЛрдЧрд╛

рдЫрд╡рд┐


рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ C ++ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдореБрдЦреНрдп рд╕рдореНрдореЗрд▓рди рдерд╛ - CPPCON ред
рд▓рдЧрд╛рддрд╛рд░ рд╕реБрдмрд╣ 8 рдмрдЬреЗ рд╕реЗ рд░рд╛рдд 10 рдмрдЬреЗ рддрдХ рдЦрдмрд░реЗрдВ рдЖрдИрдВред рд╕рднреА рдзрд░реНрдореЛрдВ рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдиреЗ рд╕реА ++ рдХреЗ рднрд╡рд┐рд╖реНрдп рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА, рдмрд╛рдЗрдХ рдХреЛ рдЬрд╣рд░ рджрд┐рдпрд╛ рдФрд░ рд╕реЛрдЪрд╛ рдХрд┐ рдХреИрд╕реЗ рд╕реА ++ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдпрд╛ рдЬрд╛рдПред


рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдХрдИ рд░рд┐рдкреЛрд░реНрдЯреЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдереАрдВред рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдпрд╛ рдХреЛрдб рд╢реАрдЯ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
C ++ 2a рдореЗрдВ рдХреМрди рд╕реЗ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ?


рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ


рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рднреА рдЧрд▓рдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ 2 рдмрдбрд╝реЗ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  • рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐рдпрд╛рдБред
  • рдШрд╛рддрдХ рдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВред

рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐рдпрд╛рдБ


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


рд╕реА ++ рдореЗрдВ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рддрд░реАрдХреЗ рд╣реИрдВ:



рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХреНрд░реИрд╢ ( 1 , 2 , 3 ) рдкрд░ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧреА рд╣реИрдВред


рдЧреИрд░ рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ


рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдЬрд┐рдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐рдпрд╛рдВ, рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛, рдЖрджрд┐ред рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЪреАрдЬреЛрдВ рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╣реИред рдЙрдирдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, C ++ рдореЗрдВ рдХрдИ рдЖрдо рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХреГрдд рд░рдгрдиреАрддрд┐ рд╣реИрдВред
рд╣рдо рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ:


рдЖрдЗрдП, рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди void addTwo() рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдлрд╝рдВрдХреНрд╢рди рдХреЛ 2 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрдиреНрд╣реЗрдВ int рдмрджрд▓рдирд╛ рдФрд░ рдпреЛрдЧ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред IO рддреНрд░реБрдЯрд┐рдпреЛрдВ, рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдирд┐рд░реНрдмрд╛рдз рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рд╣рдо 3 рдореБрдЦреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред


1. рдЕрдкрд╡рд╛рдж


 //     //   IO  std::runtime_error std::string readLine(); //    int //     std::invalid_argument int parseInt(const std::string& str); //  a  b //     std::overflow_error int safeAdd(int a, int b); void addTwo() { try { std::string aStr = readLine(); std::string bStr = readLine(); int a = parseInt(aStr); int b = parseInt(bStr); std::cout << safeAdd(a, b) << std::endl; } catch(const std::exeption& e) { std::cout << e.what() << std::endl; } } 

C ++ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдЖрдкрдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмрд┐рдирд╛ рдХреЗрдВрджреНрд░реАрдп рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ,
рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдкреВрд░реЗ рдвреЗрд░ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


  • рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдУрд╡рд░рд╣реЗрдб рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ, рдЖрдк рдЕрдХреНрд╕рд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдирд╣реАрдВ рдлреЗрдВрдХ рд╕рдХрддреЗред
  • рдпрд╣ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ / рд╡рд┐рдзреНрд╡рдВрд╕рдХреЛрдВ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рди рдлреЗрдВрдХреЗ рдФрд░ RAII рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВред
  • рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ, рдпрд╣ рд╕рдордЭрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЕрдкрд╡рд╛рдж рдХреНрдпрд╛ рдЙрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
  • рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдкрд╡рд╛рдж рд╕рдорд░реНрдерди рдХреЛрдб рдХреЗ рдХрд╛рд░рдг рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдмрдврд╝рддрд╛ рд╣реИред

2. рдХреЛрдб рд▓реМрдЯрд╛рдПрдВ


рд╕реА рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╢рд╛рд╕реНрддреНрд░реАрдп рджреГрд╖реНрдЯрд┐рдХреЛрдгред


 bool readLine(std::string& str); bool parseInt(const std::string& str, int& result); bool safeAdd(int a, int b, int& result); void processError(); void addTwo() { std::string aStr; int ok = readLine(aStr); if (!ok) { processError(); return; } std::string bStr; ok = readLine(bStr); if (!ok) { processError(); return; } int a = 0; ok = parseInt(aStr, a); if (!ok) { processError(); return; } int b = 0; ok = parseInt(bStr, b); if (!ok) { processError(); return; } int result = 0; ok = safeAdd(a, b, result); if (!ok) { processError(); return; } std::cout << result << std::endl; } 

рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ?


  1. рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛ рд╕рдХрддреЗред
  2. рддреНрд░реБрдЯрд┐ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ (рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдкрдиреЗ рдкреНрд░рд┐рдВрдЯрдлрд╝ рд╕реЗ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХреА рдереА?)ред
  3. рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдЧреЗ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕реЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
    C ++ 17 рдФрд░ C ++ 2a рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХреНрд░рдо рд╕реЗ рдареАрдХ рдХрд░реЗрдЧрд╛ред

3. рд╕реА ++ 17 рдФрд░ рдиреЛрдбреЛрдХрд╛рд░реНрдб


C ++ 17 рдореЗрдВ nodiscard рд╣реИред
рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд░рд┐рдЯрд░реНрди рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╕реЗ рд╕рдВрдХрд▓рдХ рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред


 [[nodiscard]] bool doStuff(); /* ... */ doStuff(); //  ! bool ok = doStuff(); // . 

рдЖрдк рдПрдХ рд╡рд░реНрдЧ, рд╕рдВрд░рдЪрдирд╛, рдпрд╛ nodiscard рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП nodiscard рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдлреИрд▓реА рд╣реБрдИ рд╣реИ рдЬреЛ рд▓реЗрдмрд▓ рдХрд┐рдП рдЧрдП nodiscard рдорд╛рди nodiscard ред


 enum class [[nodiscard]] ErrorCode { Exists, PermissionDenied }; ErrorCode createDir(); /* ... */ createDir(); 

рдореИрдВ nodiscard рдХреЗ рд╕рд╛рде рдХреЛрдб рдкреНрд░рджрд╛рди рдирд╣реАрдВ nodiscard ред


рд╕реА ++ 17 рдПрд╕рдЯреА :: рд╡реИрдХрд▓реНрдкрд┐рдХ


C ++ 17 рдореЗрдВ, std::optional<T> ред
рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдм рдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред


 std::optional<std::string> readLine(); std::optional<int> parseInt(const std::string& str); std::optional<int> safeAdd(int a, int b); void addTwo() { std::optional<std::string> aStr = readLine(); std::optional<std::string> bStr = readLine(); if (aStr == std::nullopt || bStr == std::nullopt){ std::cerr << "Some input error" << std::endl; return; } std::optional<int> a = parseInt(*aStr); std::optional<int> b = parseInt(*bStr); if (!a || !b) { std::cerr << "Some parse error" << std::endl; return; } std::optional<int> result = safeAdd(*a, *b); if (!result) { std::cerr << "Integer overflow" << std::endl; return; } std::cout << *result << std::endl; } 

рдЖрдк рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЗрди-рдЖрдЙрдЯ рддрд░реНрдХ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдХреНрд▓реАрдирд░ рдмрди рдЬрд╛рдПрдЧрд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рддреНрд░реБрдЯрд┐ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдХрдм рдФрд░ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реБрдЖред
рдЖрдк std::optional рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ std::optional рд╕рд╛рде std::optional std::variant<ResultType, ValueType> ред
рдХреЛрдб рдХрд╛ рдЕрд░реНрде std::optional рд╕рд╛рде рд╣реА рд╣реИ std::optional , рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдмреЛрдЭрд┐рд▓ред


C ++ 2a рдФрд░ std :: рдЕрдкреЗрдХреНрд╖рд┐рдд


std::expected<ResultType, ErrorType> - рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░ , рдпрд╣ рд╕рдВрднрд╡рддрдГ рдирд┐рдХрдЯрддрдо рдЕрдкреВрд░реНрдг рдорд╛рдирдХ рдореЗрдВ рдЖ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рдХреЗ 2 рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред


  • ReusltType рдЕрдкреЗрдХреНрд╖рд┐рдд рдорд╛рди рд╣реИред
  • ErrorType - рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ред
    std::expected рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдорд╛рди рдпрд╛ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
     std::expected<int, string> ok = 0; expected<int, string> notOk = std::make_unexpected("something wrong"); 

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп variant рд╕реЗ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдЦрд╛рд╕ рд╣реИ рдЗрд╕реЗ?
std::expected рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рд╣реЛрдЧрд╛ ред
рдпрд╣ std::expected рдкрд░ рдкрд░рд┐рдЪрд╛рд▓рди рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ std::expected рдПрдХ catch_error рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА std::expected : map , catch_error , bind , unwrap , return рдФрд░ then ред
рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЪреЗрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЪреЗрди рдореЗрдВ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


 getInt().map([](int i)return i * 2;) .map(integer_divide_by_2) .catch_error([](auto e) return 0; ); 

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ std::expected рд╕рд╛рде рдХрд╛рд░реНрдп рд╣реИрдВред


 std::expected<std::string, std::runtime_error> readLine(); std::expected<int, std::runtime_error> parseInt(const std::string& str); std::expected<int, std::runtime_error> safeAdd(int a, int b); 

рдиреАрдЪреЗ рдХреЗрд╡рд▓ рдЫрджреНрдо рдХреЛрдб рд╣реИ, рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдЖрдзреБрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк рд╕рд╛рдзреБрдУрдВ рдкрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрдХреЗрд▓ рдбреЛ-рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рди рджреЗрдВ:


 std::expected<int, std::runtime_error> result = do { auto aStr <- readLine(); auto bStr <- readLine(); auto a <- parseInt(aStr); auto b <- parseInt(bStr); return safeAdd(a, b) } 

рдХреБрдЫ рд▓реЗрдЦрдХ рдЗрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ:


 try { auto aStr = try readLine(); auto bStr = try readLine(); auto a = try parseInt(aStr); auto b = try parseInt(bStr); std::cout result << std::endl; return safeAdd(a, b) } catch (const std::runtime_error& err) { std::cerr << err.what() << std::endl; return 0; } 

рд╕рдВрдХрд▓рдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдХреЛрдб рдХреЗ рдРрд╕реЗ рдмреНрд▓реЙрдХ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рддреЛ рдЗрд╕рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ, рдЧрдгрдирд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЯреВрдЯ рдЬрд╛рдПрдЧреАред рд╣рд╛рдВ, рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдорд╛рдирдХ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдЕрдкрд╡рд╛рдж рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: std::runtime_error , std::out_of_range , рдЖрджрд┐ред


рдпрджрд┐ рдЖрдк рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ std::expected рдЖрдкрдХреЛ рд╕рд░рд▓ рдФрд░ рдХреБрд╢рд▓ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред


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


рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рдЖрджрд░реНрд╢ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, C ++ рдореЗрдВ рдореЛрдирдбреЗрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рд╕рдВрднрд╡ рддрд░реАрдХреЗ рдереЗред
C ++ 2a рдореЗрдВ, рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред


рд╡рд┐рд╖рдп рдкрд░ рдХреНрдпрд╛ рдкрдврд╝рдирд╛ рдФрд░ рджреЗрдЦрдирд╛ рд╣реИ


  1. рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ ред
  2. CPPCON рдХреЗ рд╕рд╛рде рдЕрдкреЗрдХреНрд╖рд┐рдд std рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рд╖рдг ред
  3. рдЖрдВрджреНрд░реЗрдИ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ std :: C ++ рд░реВрд╕ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд ред
  4. рд░реЗрдбрд┐рдЯ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╣рд╛рд▓ рдХреЗ рдХрдореЛрдмреЗрд╢ рдЪрд░реНрдЪрд╛ ред

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


All Articles