
рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ 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; }
рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ?
- рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛ рд╕рдХрддреЗред
- рддреНрд░реБрдЯрд┐ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ (рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдкрдиреЗ рдкреНрд░рд┐рдВрдЯрдлрд╝ рд╕реЗ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХреА рдереА?)ред
- рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдЧреЗ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕реЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
C ++ 17 рдФрд░ C ++ 2a рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХреНрд░рдо рд╕реЗ рдареАрдХ рдХрд░реЗрдЧрд╛ред
3. рд╕реА ++ 17 рдФрд░ рдиреЛрдбреЛрдХрд╛рд░реНрдб
C ++ 17 рдореЗрдВ nodiscard
рд╣реИред
рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд░рд┐рдЯрд░реНрди рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╕реЗ рд╕рдВрдХрд▓рдХ рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред
[[nodiscard]] bool doStuff(); 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 рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред
рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп 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 рдореЗрдВ, рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
рд╡рд┐рд╖рдп рдкрд░ рдХреНрдпрд╛ рдкрдврд╝рдирд╛ рдФрд░ рджреЗрдЦрдирд╛ рд╣реИ
- рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ ред
- CPPCON рдХреЗ рд╕рд╛рде рдЕрдкреЗрдХреНрд╖рд┐рдд std рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рд╖рдг ред
- рдЖрдВрджреНрд░реЗрдИ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ std :: C ++ рд░реВрд╕ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд ред
- рд░реЗрдбрд┐рдЯ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╣рд╛рд▓ рдХреЗ рдХрдореЛрдмреЗрд╢ рдЪрд░реНрдЪрд╛ ред