рдореЗрдЯрд╛ рдХреНрд░рд╢ рд╕рд╛рдЧрд╛: рд╕рдВрдХрд▓рди-рд╕рдордп рдХрд╛ рдЦреЗрд▓

рдЫрд╡рд┐

рд▓реАрдб рд╕реАрдирд┐рдпрд░ рд╕реА ++ рдУрд╡рд░-рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╢реАрд░реНрд╖рдХ рдкрд░ рдЬрд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдореИрдВрдиреЗ рдЦреЗрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдЖрдзреБрдирд┐рдХ C ++ (C ++ 17) рдХреЗ рдХреНрд╡рд┐рдВрдЯреЗрд╕рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХреЗ рдШрдВрдЯреЛрдВ (рдХреИрдВрдбреА рдХреНрд░рд╢ рд╕рд╛рдЧрд╛) рдХреЗ рджреМрд░рд╛рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП рдореЗрдЯрд╛ рдХреНрд░рд╢ рд╕рд╛рдЧрд╛ рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖ: рдПрдХ рдЧреЗрдо рдЬреЛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ ред рдореИрдВ рдореИрдЯ рдмрд░реНрдирд░ рдХреЗ рдирд┐рдмрд▓рд░ рдЧреЗрдо рд╕реЗ рдмрд╣реБрдд рдкреНрд░реЗрд░рд┐рдд рдерд╛, рдЬрд┐рд╕рдиреЗ рдиреЛрдХрд┐рдпрд╛ 3310 рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рд┐рджреНрдз рд╕рд╛рдБрдк рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдкрд░ рд╢реБрджреНрдз рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред

" рдпрд╣ рд╕рдВрдХрд▓рди рдХреЗ рд╕реНрддрд░ рдкрд░ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдЦреЗрд▓ рдЪрд▓ рд░рд╣рд╛ рд╣реИ ?", "рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?", "рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдкрдиреЗ C ++ 17 рдХреА рдХрд┐рд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛?", "рдЖрдкрдиреЗ рдХреНрдпрд╛ рд╕реАрдЦрд╛?" - рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕рд╡рд╛рд▓ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдкреВрд░реА рдкреЛрд╕реНрдЯ рдкрдврд╝рдиреА рд╣реЛрдЧреА, рдпрд╛ рдЕрдкрдиреЗ рднреАрддрд░ рдХреЗ рдЖрд▓рд╕реНрдп рдХреЛ рдЦрддреНрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкреЛрд╕реНрдЯ рдХрд╛ рд╡реАрдбрд┐рдпреЛ рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ - рд╕реНрдЯреЙрдХрд╣реЛрдо рдореЗрдВ рдореАрдЯрдЕрдк рдШрдЯрдирд╛ рд╕реЗ рдореЗрд░реА рд░рд┐рдкреЛрд░реНрдЯ:


рдиреЛрдЯ: рдЕрдкрдиреЗ рдорд╛рдирд╕рд┐рдХ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рдЦрд╛рддрд┐рд░ рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдорд╛рдирд╡ рдПрд╕реНрдЯреНрд░рдо рдХреЛ рдорд┐рдЯрд╛рддреЗ рд╣реИрдВ , рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреБрдЫ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрдереНрдп рджрд┐рдП рдЧрдП рд╣реИрдВред

рдПрдХ рдЦреЗрд▓ рдЬреЛ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдЪрд▓рддрд╛ рд╣реИ?



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

рдПрдХ рдирд┐рдпрдорд┐рдд рдЦреЗрд▓ рдХрд╛ рдЬреАрд╡рди рдЪрдХреНрд░:


рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЬреАрд╡рди рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдХреЗ рдПрдХ рдирд┐рдпрдорд┐рдд рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдорд╛рдирд╕рд┐рдХ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрддрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдорд┐рдд рдиреМрдХрд░реА рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ (рд╕реА ++ рдореЗрдВ!) рдХреЗ рдЦреЗрд▓ рддрд░реНрдХ рд▓рд┐рдЦрдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рд╕реНрдкреЗрдЧреЗрдЯреА рдХреЛ рднреА рдЕрдХреНрд╕рд░ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдЪрд▓рд╛рддреЗ рд╣реИрдВ! рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рддрд░реНрдХред рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ (рдпрд╛ рдХрдВрд╕реЛрд▓ рд╕реЗ рд╢реБрд░реВ) рдкрд░ рдбрдмрд▓-рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЦреЗрд▓ рддрд░реНрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧреА, рдЬрд┐рд╕рдореЗрдВ 99.42% рд╕рдордп рдореЗрдВ рдПрдХ рдЧреЗрдо рдЪрдХреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЦреЗрд▓ рдЪрдХреНрд░ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ , рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ рдЧреЗрдо рдХреА рдирдИ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред


рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЦреЗрд▓ рдХрд╛ рдЬреАрд╡рди рдЪрдХреНрд░:


рдПрдХ рдУрд╡рд░-рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЬреЛ рдЕрдкрдиреЗ рдирдП рд╢рд╛рдВрдд рд╕рдВрдХрд▓рди рдЧреЗрдо рдХреЛ рдмрдирд╛рддрд╛ рд╣реИ, рдЖрдк рдЕрднреА рднреА рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ (рдЕрднреА рднреА C ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ!) рдЦреЗрд▓ рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ред рдлрд┐рд░, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╕рдВрдХрд▓рди рдЪрд░рдг рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рдЬрд┐рд╢ рдореЛрдбрд╝ рд╣реИ: рдЖрдк рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЕрдкрдиреЗ рдЦреЗрд▓ рддрд░реНрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕реЗ "рдирд┐рд╖реНрдкрд╛рджрди" (рд╕рдВрдХрд▓рди) рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣рд╛рдБ C ++ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ; рдЗрд╕рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдЯрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдЯреАрдПрдордкреА) рдФрд░ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдЬреИрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред рдмрд╛рдж рдореЗрдВ рд╣рдо рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣рдо рдЦреЗрд▓ рдХреЗ рддрд░реНрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рд╕рдордп рд╣рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рднреА рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдорд╛рд░реЗ рд╕рдВрдХрд▓рдХ рдЕрднреА рднреА рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВрдЧреЗред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдм рдЧреЗрдо рд▓реВрдк рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдорд┐рд╢рди рд╣реИ: рдПрдХ рдирдИ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ред рдЖрдЗрдП рдЗрд╕ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рд░реЗрдВрдбрд░рд░ рдХрд╣рддреЗ рд╣реИрдВ , рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рд╣рдорд╛рд░реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдореЗрдВ, рди рддреЛ рд╕реБрдВрджрд░ рдХрдг рдкреНрд░рднрд╛рд╡ рдФрд░ рди рд╣реА рдкрд░рд┐рд╡реЗрд╢ рд░реЛрдбрд╝рд╛ рдЫрд╛рдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рдпрд╣ ASCII рд╣реЛрдЧрд╛ред рдирдП рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рд░рд╛рдЬреНрдп рдХрд╛ рдПрдПрд╕рд╕реАрдЖрдИрдЖрдИ рдкреНрд░рддрд┐рдкрд╛рджрди рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЗрд╕реЗ рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВ рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓? рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкрд┐рдЫрд▓реЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рд▓реВрдк рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЧреЗрдо рдореЗрдВ рдПрдХ рдЧреЗрдо рдЪрдХреНрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЧреЗрдо рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдПрдХ рд╕рдВрдХрд▓рди рдЪрд░рдг рд╣реЛрддрд╛ рд╣реИ ред рд╕рдВрдХрд▓рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдЦреЗрд▓ рдХреА рдПрдХ рдирдИ рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рдХреЗ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо / рд╕реНрдЯреЗрдЬ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдЗрд╕ рд╢рд╛рдирджрд╛рд░ рдЖрд░реЗрдЦ рдкрд░ рдЙрддрдирд╛ рд╣реА рдЪрд┐рдВрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рддрдирд╛ рдХрд┐ рдЬрдм рддрдХ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рд╣реИ:


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрдХреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рдореБрдЭрд╕реЗ рдПрдХрдорд╛рддреНрд░ рд╕рд╡рд╛рд▓ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ...

"рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рди рдХреНрдпреЛрдВ?"



рдХреНрдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░реА C ++ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЖрдЗрдбрд┐рдпрд▓ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рдирд╛ рдПрдХ рдРрд╕рд╛ рдореМрд▓рд┐рдХ рдкреНрд░рд╢реНрди рд╣реИ? рд╣рд╛рдБ, рдЬреАрд╡рди рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ!

  • рдкрд╣рд▓реА рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЧреЗрдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреА рдПрдХ рдЕрджреНрднреБрдд рдЧрддрд┐ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЧрдгрдирд╛ рдЪрд░рдг рдореЗрдВ рдЧрдгрдирд╛ рдХреЗ рдереЛрдХ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд░рдирдЯрд╛рдЗрдо рд╕реНрдкреАрдб ASCII рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдПрдПрдП рдЧреЗрдо рдХреА рд╕рдлрд▓рддрд╛ рдХреА рдХреБрдВрдЬреА рд╣реИ!
  • рдЖрдк рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдХреНрд░рд╕реНрдЯреЗрд╢рд┐рдпрди рдЖрдкрдХреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ рдФрд░ рдЖрдкрд╕реЗ рдЦреЗрд▓ рдХреЛ рд░рд╕реНрдЯ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗред рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЙрд╕реЗ рд╕рдордЭрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕рдХрд╛ рдЕрд╡реИрдз рднрд╛рд╖рдг рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реВрдЪрдХ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ рднрд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рднреА рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рд┐рдкрд╕реНрдЯрд░ рд╕рд╛рдореНрд░рд╛рдЬреНрдп рдХрд╛ рд╕рдореНрдорд╛рди рдЬреАрддреЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдордЬрдмреВрдд NIH рд╕рд┐рдВрдбреНрд░реЛрдо рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдкреБрди: рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдврд╛рдВрдЪреЗ рдкрд░ рд╢рд╛рд╕рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ рдпрд╣ рдПрдХ рд╢рд╛рдВрдд рдирд╛рдо рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред
  • рдореЗрд░рд╛ рдПрдХ рджреЛрд╕реНрдд рдХрд╣рддрд╛ рдерд╛ рдХрд┐ рдкрд░реНрд▓ рдХреЛрдб рдХреА рдХрд┐рд╕реА рднреА рд▓рд╛рдЗрди рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдордЬрдмреВрдд рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЙрд╕рдиреЗ рдХрднреА рднреА C ++ рдХрдВрдкрд╛рдЗрд▓ рдЯрд╛рдЗрдо рд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреАред

рдЦреИрд░? рдХреНрдпрд╛ рдЖрдк рдореЗрд░реЗ рдЙрддреНрддрд░реЛрдВ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ? рддрдм рд╢рд╛рдпрдж рдЖрдкрдХрд╛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: "рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ?"

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

рдореЗрдЯрд╛ рдХреНрд░рд╢ рд╕рд╛рдЧрд╛ рдЧреЗрдо рд░рд┐рд╡реНрдпреВ


рдореИрдЪ -3 рдЦреЗрд▓:


рдореЗрдЯрд╛ рдХреНрд░рд╢ рд╕рд╛рдЧрд╛ рдмреЗрдЬрд▓рд╡реЗрдб рдФрд░ рдХреИрдВрдбреА рдХреНрд░рд╢ рд╕рд╛рдЧрд╛ рдХреЗ рд╕рдорд╛рди рдПрдХ рдЯрд╛рдЗрд▓ рдЬреЙрдЗрдирд┐рдВрдЧ рдЧреЗрдо рд╣реИ ред рдЦреЗрд▓ рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдореВрд▓ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рддреАрди рдЯрд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдпрд╣рд╛рдБ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ "рдбрдВрдк" рдХрд┐рдпрд╛ (ASCII рдореЗрдВ рдбрдВрдкрд┐рдВрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:

  рдЖрд░ тАЭ(
     рдореЗрдЯрд╛ рдХреНрд░рд╢ рд╕рд╛рдЧрд╛      
 ------------------------  
 |  | 
 |  RBGBBYGR | 
 |  | 
 |  | 
 |  YYGRBGBR | 
 |  | 
 |  | 
 |  RBYRGRYG | 
 |  | 
 |  | 
 |  RYBY (R) YGY | 
 |  | 
 |  | 
 |  BGYRYGGR | 
 |  | 
 |  | 
 |  RYBGYBBG | 
 |  | 
 ------------------------  
 > рд╕реНрдХреЛрд░: 9009
 > рдЪрд╛рд▓: реи:
 ) " 


рдЗрд╕ рдореИрдЪ -3 рдЧреЗрдо рдХрд╛ рдЧреЗрдордкреНрд▓реЗ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдпрд╣ рд╕рдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреЗ рдЦреЗрд▓ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рд╣рд░ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдЦреЗрд▓ рд░рд╛рдЬреНрдп рдЗрдВрдЬреЗрдХреНрд╢рди:



рдпрджрд┐ рдЖрдк рдПрдХ рднрд╛рд╡реБрдХ C ++ рдкреНрд░реЗрдореА рдпрд╛ рдкреЗрдбреЗрдВрдЯ рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд┐рдЫрд▓рд╛ рдЧреЗрдо рд╕реНрдЯреЗрдЯ рдбрдВрдк рдирд┐рдореНрди рдкреИрдЯрд░реНрди рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ: "R" ( ! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рдХрдЪреНрдЪрд╛ C ++ 11 рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рд╣реИ , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреБрд╡рд╛рдж рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ : рдХрдЪреНрдЪреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ current_state.txt рдирд╛рдордХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рдЦреЗрд▓ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдХрд▓рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреИрд╕реЗ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ? рдЪрд▓реЛ рдмрд╕ рдЗрд╕реЗ рд▓реВрдк рдЗрдирдкреБрдЯ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВ!

// loop_inputs.hpp constexpr KeyboardInput keyboard_input = KeyboardInput::KEYBOARD_INPUT; //       constexpr auto get_game_state_string = []() constexpr { auto game_state_string = constexpr_string( //       #include "current_state.txt" ); return game_state_string; }; 

рдЪрд╛рд╣реЗ рд╡рд╣ рдПрдХ .txt рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдПрдХ .h рдлрд╝рд╛рдЗрд▓ рд╣реЛ, C рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рд╢рд╛рдорд┐рд▓ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛: рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЙрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдореИрдВ рдЦреЗрд▓ рд░рд╛рдЬреНрдп рдХреЗ рдХрдЪреНрдЪреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдХреЛ ascii рдореЗрдВ рдПрдХ рдЪрд░ рдореЗрдВ game_state_string рдирд╛рдордХ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реВрдВ ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ loop_inputs.hpp рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рднреА рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдХреЛ рдореМрдЬреВрджрд╛ рдлреНрд░реЗрдо / рд╕рдВрдХрд▓рди рдЪрд░рдг рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИред рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреАрдмреЛрд░реНрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛рдлреА рдЫреЛрдЯреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдХрд▓рд┐рдд рд╕рдордп рдкрд░ рдПрдХ рдирдП рд░рд╛рдЬреНрдп рдХреА рдЧрдгрдирд╛:



рдЕрдм рдЬрдм рд╣рдордиреЗ рдкрд░реНрдпрд╛рдкреНрдд рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдирдП рд░рд╛рдЬреНрдп рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдБрдЪ рдЧрдП рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдореЗрдВ main.cpp рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 // main.cpp #include "loop_inputs.hpp" //   ,   . // :    . constexpr auto current_state = parse_game_state(get_game_state_string); //      . constexpr auto new_state = game_engine(current_state) //    , .update(keyboard_input); //  ,    . constexpr auto array = print_game_state(new_state); //      std::array<char>. // :    . //  :   . for (const char& c : array) { std::cout << c; } 

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

рдЖрдк рдпрд╣ рднреА рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреЛрдб рдХреЗрд╡рд▓ рдПрдХ рдлреНрд░реЗрдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреЛрдИ рдЧреЗрдо рд▓реВрдк рдирд╣реАрдВ рд╣реИ ред рдЖрдЗрдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░реЗрдВ!

рд╣рдо рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдЧреЛрдВрдж рдХрд░рддреЗ рд╣реИрдВ:



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

 #  !  ,    !!! while; do : #      G++ g++ -o renderer main.cpp -DKEYBOARD_INPUT="$keypressed" keypressed=get_key_pressed() #  . clear #   current_state=$(./renderer) echo $current_state #    #     current_state.txt file       . echo "R\"(" > current_state.txt echo $current_state >> current_state.txt echo ")\"" >> current_state.txt done 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рдХрдВрд╕реЛрд▓ рд╕реЗ рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдереЛрдбрд╝реА рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рдереАред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВ рд╕рдВрдХрд▓рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдХрдИ рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рдж, рдореИрдВ рдмреИрд╢ рд╕реЗ read рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдореИрдВ рдПрдХ рд╡рд┐рд╡рд╛рдж рдореЗрдВ рдЬрд╛рджреВрдЧрд░ рдмреИрд╢ рд╕реЗ рд▓рдбрд╝рдиреЗ рдХреА рд╣рд┐рдореНрдордд рдирд╣реАрдВ рдХрд░рддрд╛ - рдпрд╣ рднрд╛рд╖рд╛ рдмрд╣реБрдд рднрдпрд╛рд╡рд╣ рд╣реИ!

рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЦреЗрд▓ рдЪрдХреНрд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдореБрдЭреЗ C ++ рдореЗрдВ рдХреЛрдб рдХреЗ рдЗрд╕ рднрд╛рдЧ рдХреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдирдХрд╛рд░рддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЦреЗрд▓ рдХрд╛ 90% рддрд░реНрдХ рдЬреА ++ рд╕рдВрдХрд▓рди рдЯреАрдо рдХреЗ рдЕрдВрджрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ , рдЬреЛ рдХрд┐ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ!

рдЕрдкрдиреА рдЖрдВрдЦреЛрдВ рдХреЛ рдЖрд░рд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЧреЗрдордкреНрд▓реЗ:


рдЕрдм рдЬрдм рдЖрдкрдиреЗ рдЦреЗрд▓ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдкреАрдбрд╝рд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдВрдЦреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ:


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

рдПрдХ .txt рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд┐рд╕реА рдЧреЗрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рдордЬрд╝реЗрджрд╛рд░ рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЪрд░рдо рдорд╛рдорд▓реЛрдВ рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдзреЛрдЦрд╛ рджреЗрдирд╛ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ред

рдЕрдм рдЬрдм рдореИрдВрдиреЗ рдЖрдкрдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд C ++ 17 рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдЧреЗрдо рд▓реЙрдЬрд┐рдХ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореИрдЪ -3 рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореИрдВ рд╕реА ++ рдХреЗ рдкрд╣рд▓реБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

C ++ 17 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓:



C ++ 14 рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд┐рд╕рдореЗрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдорд╛рдореВрд▓реА рд╕реБрдзрд╛рд░ рд╢рд╛рдорд┐рд▓ рдереЗ, рдирдпрд╛ C ++ 17 рдорд╛рдирдХ рд╣рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реА рдЙрдореНрдореАрджреЗрдВ рдереАрдВ рдХрд┐ рдЖрдЦрд┐рд░рдХрд╛рд░ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ (рдореЙрдбреНрдпреВрд▓, рдХреЙрд░рдЯреБрдЗрди, рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ ...) рдЖрдЦрд┐рд░рдХрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ ... рд╡реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреАрдВ; рдЗрд╕рдиреЗ рд╣рдо рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╢реЛрдХ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдХрдИ рдЫреЛрдЯреЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЦрдЬрд╛рдиреЗ рдорд┐рд▓реЗ рдЬреЛ рдЕрднреА рднреА рдорд╛рдирдХ рдореЗрдВ рдирд╣реАрдВ рдереЗред

рдореИрдВ рдпрд╣ рдХрд╣рдиреЗ рдХреА рд╣рд┐рдореНрдордд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЬреЛ рдмрдЪреНрдЪреЗ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рдЗрд╕ рд╕рд╛рд▓ рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ! рднрд╛рд╖рд╛ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдФрд░ рдкрд░рд┐рд╡рд░реНрдзрди рдЕрдм рдЖрдкрдХреЛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рдХрдо рд╕рдордп рдореЗрдВ рдФрд░ рдмрд╛рдж рдХреЗ рд╕рдордп рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдмрд╛рдзрд╛:


рдЬреИрд╕рд╛ рдХрд┐ рдмреЗрди рдбреАрди рдФрд░ рдЬреЗрд╕рди рдЯрд░реНрдирд░ рдиреЗ рд╕реА ++ 14 рдкрд░ рдЕрдкрдиреА рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рдереА, рд╕реА ++ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд╢рдХреНрддрд┐рдорд╛рди рдХреАрд╡рд░реНрдб рдмрд╛рдзрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдВрдХрд▓рди рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдХреАрд╡рд░реНрдб рдХреЛ рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕реНрдерд┐рдд рдХрд░рдХреЗ, рдЖрдк рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╕реАрдзреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред C ++ 11 рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 constexpr int factorial(int n) //    constexpr       . { return n <= 1? 1 : (n * factorial(n - 1)); } int i = factorial(5); //  constexpr-. //      : // int i = 120; 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдХреАрд╡рд░реНрдб рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕рд┐рд╡ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

C ++ 14 рдиреЗ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 constexpr int factorial(int n) { if (n <= 1) { return 1; } return n * factorial(n - 1); } 

C ++ 14 рдиреЗ рдЗрд╕ рдирд┐рдпрдо рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛ рдХрд┐ рдПрдХ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЛ рдореБрдЦреНрдп рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ред рдЕрдм C ++ 17 рдФрд░ рднреА рдЕрдзрд┐рдХ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдХреАрд╡рд░реНрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рд╢рд╛рдЦрд╛рдПрдБ:


рдХреНрдпрд╛ рдЖрдк рдХрднреА рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдП рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдЙрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЬреЛрдбрд╝ рддреЛрдбрд╝ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХ .serialize() рдлрд╝рдВрдХреНрд╢рди serialize рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ .serialize() рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЙрд▓ to_string рд╕рд╣рд╛рд░рд╛ to_string ред рдЬреИрд╕рд╛ рдХрд┐ SFINAE рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд┐рджреЗрд╢реА рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:

 template <class T> std::enable_if_t<has_serialize_v<T>, std::string> serialize(const T& obj) { return obj.serialize(); } template <class T> std::enable_if_t<!has_serialize_v<T>, std::string> serialize(const T& obj) { return std::to_string(obj); } 

рдХреЗрд╡рд▓ рдПрдХ рд╕рдкрдиреЗ рдореЗрдВ рдЖрдк SFINAE рдЪрд╛рд▓ рд╕реЗ C ++ 14 рддрдХ рдЗрд╕ рдмрджрд╕реВрд░рдд рдХреЛрдб рдХреЛ рдРрд╕реЗ рд╢рд╛рдирджрд╛рд░ рдХреЛрдб рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 // has_serialize -  constexpr-,  serialize  . // .    SFINAE,  ,    . template <class T> constexpr bool has_serialize(const T& /*t*/); template <class T> std::string serialize(const T& obj) { //  ,  constexpr    . if (has_serialize(obj)) { return obj.serialize(); } else { return std::to_string(obj); } } 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬрдм рдЖрдк рдЬрд╛рдЧ рдЧрдП рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ C ++ 14 рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рддреЛ рдЖрдкрдХреЗ рд╕рдВрдХрд▓рдХ рдиреЗ serialize(42); рдХреЙрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдкреНрд░рд┐рдп рд╕рдВрджреЗрд╢ рдЙрдЧрд▓ рджрд┐рдпрд╛ serialize(42); ред рдпрд╣ рд╕рдордЭрд╛рдпрд╛ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ int рдХрд╛ рдПрдХ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди serialize() ред рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рдВрдХрд▓рдХ рд╕рд╣реА рд╣реИ! рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде, рд╡рд╣ рд╣рдореЗрд╢рд╛ рджреЛрдиреЛрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ - return obj.serialize(); рдФрд░
return std::to_string(obj); ред int рд╢рд╛рдЦрд╛ return obj.serialize(); рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдореГрдд рдХреЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ has_serialize(obj) рд╣рдореЗрд╢рд╛ false рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрднреА рднреА рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдерд╛, C ++ 17 рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдкреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ "рдмрд▓" рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ рдмрдБрдЯрд╛рдиреЗ рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рддреНрдпрд╛рдЧрдиреЗ рдХреЗ рдмрд╛рдж рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ :

 // has_serialize... // ... template <class T> std::string serialize(const T& obj) if constexpr (has_serialize(obj)) { //     constexpr   'if'. return obj.serialize(); //    ,    ,  obj  int. } else { return std::to_string(obj);branch } } 


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

рдХрд╛рдВрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдкреИрд░рд╛рдореАрдЯрд░:


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

 // loop_inputs.hpp constexpr auto get_game_state_string = []() constexpr // ? { auto game_state_string = constexpr_string( //       #include "current_state.txt" ); return game_state_string; }; 

рд╡реИрд░рд┐рдПрдмрд▓ game_state_string рдХреЛ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рдХреНрдпреЛрдВ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рд╡рд╣ рдЙрд╕реЗ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдмрд╛рдзрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ ?

рдореИрдВ рдЗрд╕ рдЪрд░ рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдореЗрд░реЗ parse_board рдкрд░ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХреБрдЫ рд╕реНрдерд┐рд░ рднрд╛рд╡реЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 constexpr int parse_board_size(const char* game_state_string); constexpr auto parse_board(const char* game_state_string) { std::array<GemType, parse_board_size(game_state_string)> board{}; // ^ 'game_state_string' -   - // ... } parse_board(тАЬ...something...тАЭ); 

рдпрджрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЧреНрд░реВрдЪреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ рдХрд┐ game_state_string рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИред рдЬрдм рдореИрдВ рдЕрдкрдирд╛ рдЯрд╛рдЗрд▓ рд╕рд░рдгреА рдмрдирд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рд╕реАрдзреЗ рдЗрд╕рдХреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреНрд╖рдорддрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╣рдо рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╡реИрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ) рдФрд░ рдЗрд╕реЗ std :: array рдореЗрдВ рдорд╛рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, parse_board_size (game_state_string) рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐ parse_board_size рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , game_state_string рдирд╣реАрдВ рд╣реИ рдФрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ! рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛ рдирд┐рдпрдо рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддреЗ рд╣реИрдВ:

  • рдПрдХ constexpr рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ constexpr рдирд╣реАрдВ рд╣реИрдВ!
  • рдФрд░ рд╣рдо рдЙрдирдХреЗ рд╕рд╛рдордиреЗ рдмрд╛рдзрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ!

рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рдкрд░ рдЙрдмрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕рдкреНрд░реВрдЯ рдХрд╛рд░реНрдп рдХреНрд░рдо рдФрд░ рд╕рдВрдХрд▓рди рд╕рдордп рджреЛрдиреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдорд╛рдирддреЗ рд╣реБрдП, рдпрд╣ рдЙрдиреНрд╣реЗрдВ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред


рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдорддрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдорд╛рди рдХреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рдпрдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЗрд╕ рдорд╛рди рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рддрд░рд╣ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 template <class GameStringType> constexpr auto parse_board(GameStringType&&) { std::array<CellType, parse_board_size(GameStringType::value())> board{}; // ... } struct GameString { static constexpr auto value() { return "...something..."; } }; parse_board(GameString{}); 

рдЗрд╕ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдПрдХ GameString рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдореВрд▓реНрдп () рд╣реИ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдкрд╛рд░реНрд╕_рдмреЛрд░реНрдб рдкрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ ред Parse_board рдореЗрдВ, рдореИрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ GameStringType рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ , рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдПрдХ GameStringType рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдорд╛рди () рд╕рдВрдХреБрдЪрд┐рдд рд╣реИ, рдореИрдВ рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдорд╛рди () рдХреЛ рд╕рд╣реА рд╕рдордп рдкрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рднреА рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рд▓рдЧрд╛рддрд╛рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░реНрд╕_рдмреЛрд░реНрдб рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдкрд╛рд░реНрд╕_рдмреЛрд░реНрдб рд╢рд╛рдмреНрджрд┐рдХ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: "... рдХреБрдЫ 1 ...", "... рдХреБрдЫ 2 ..."ред C ++ 11 рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдирд╛рдо рдпреВрдирд┐рдпрди рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рдмрджрд╕реВрд░рдд рдореИрдХреНрд░реЛ рдФрд░ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рдЗрдХрд▓ рдкрд╛рд░реНрдХ рдиреЗ рдЕрдкрдиреЗ рдПрдХ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕рдордЭрд╛рдпрд╛ред

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

  • рдХрд╛рд░реНрдп рдЙрддреНрдкрдиреНрди рд╣реБрдЖ
  • рд╡рд╣ рд╡рд┐рд╡рд╢ рд╣реИ
  • рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдпрд╛ рдЕрдирд╛рдо рдирд╛рдо рдХреЗ рд╕рд╛рде

рдЗрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдЖрдкрдХреЛ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕рдкреНрд░ рд▓реИрдВрдмрдбрд╛ рдХреА ! рдФрд░ рд╕реА ++ 17 рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ред рд╣рдо рдЕрдкрдиреЗ рдирдореВрдирд╛ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 template <class LambdaType> constexpr auto parse_board(LambdaType&& get_game_state_string) { std::array<CellType, parse_board_size(get_game_state_string())> board{}; // ^      constexpr-. } parse_board([]() constexpr -> { return тАЬ...something...тАЭ; }); // ^    constexpr. 

рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реА ++ 11 рдореЗрдВ рдкрд┐рдЫрд▓реА рд╣реИрдХрд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ Bjorn Fahler рдХреЗ рд▓рд┐рдП рдЗрд╕ рднрдпрд╛рдирдХ рдЪрд╛рд▓ рдХреА рдЦреЛрдЬ рдХреА, рдореИрдВ C ++ рдорд┐рдЯреНрдЯреИрдк рд╕рдореВрд╣ рдХрд╛ рдПрдХ рд╕рджрд╕реНрдп рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рднрд╛рдЧ рд▓реЗрддрд╛ рд╣реВрдВред рдЗрд╕ рдЯреНрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдирдХреЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВред рдпрд╣ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдХреАрд╡рд░реНрдб рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ: рдХреЙрдореНрдкреЗрдХреНрд╕ рдмрдирдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реИрдВрдмрдб рдЙрдиреНрд╣реЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣реЛрдВрдЧреЗред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ constexpr рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред

рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рд╡рд┐рд╡рд╢ рдореЗрдордиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдореЗрдордиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдЖрдк рдлрд┐рд░ рд╕реЗ рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рдХрд░реЗрдВрдЧреЗред рдпрд╣ constexpr_string рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдореИрдВ рд╕реНрдЯреЙрдХ рд╢рд╛рдмреНрджрд┐рдХ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ?

constexpr_string рдФрд░ constexpr_string_view:

рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕реА рд╢реИрд▓реА рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдкрдХреЛ рдЗрди рд╕рднреА рдХрд╖реНрдЯрдкреНрд░рдж рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рднреВрд▓рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХрдЪреНрдЪреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢реВрдиреНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ! C ++ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА std :: string рдФрд░ STL рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИ ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, std :: string рдХреЛ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЫреЛрдЯреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде) рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдПрдХ рдпрд╛ рджреЛ рдорд╛рдирдХреЛрдВ рдкрд░ рд╡рд╛рдкрд╕, рд╣рдо рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХ рдиреНрдпреВ / рдбрд┐рд▓реАрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╣рдо рдПрд╕рдЯреАрдЖрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕рдкреНрд░реЛ рдПрд▓реЛрдХреЗрдЯрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдореЗрдВ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ constexpr_string рд╡рд░реНрдЧ рд▓рд┐рдЦрдирд╛ рдерд╛ред рдпрд╣ рдХреНрд╖рдорддрд╛ рдорд╛рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣рд╛рдБ рдореЗрд░реА рдХрдХреНрд╖рд╛ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 template <std::size_t N> // N -    . class constexpr_string { private: std::array<char, N> data_; //  N char   -. std::size_t size_; //   . public: constexpr constexpr_string(const char(&a)[N]): data_{}, size_(N -1) { //   data_ } // ... constexpr iterator begin() { return data_; } //    . constexpr iterator end() { return data_ + size_; } //     . // ... }; 

рдореЗрд░рд╛ constexpr_string рд╡рд░реНрдЧ рдПрд╕рдЯреАрдбреА рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ :: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ (рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП) рдореЗрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╣рдо рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдХрд╛рд░ (рдЖрдХрд╛рд░) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдбреЗрдЯрд╛ (рдбреЗрдЯрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдорд┐рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рд╕рдмрд╕реНрдЯреНрд░реЗрдЯрд┐рдВрдЧ рдЗрддреНрдпрд╛рджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рдЗрд╕рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рднрд╛рдЧ std :: string рд╕реЗ constexpr_string рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ ред рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рддрдм рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ std :: string рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рдЙрди рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЬреЛ constexpr_string рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ ред

рдЖрдЗрдП рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЕрдкреЗрдВрдбрд┐рдХреНрд╕ рдСрдкрд░реЗрд╢рди рдкрд░:

 template <std::size_t N> // N -    . class constexpr_string { // ... template <std::size_t M> // M -    . constexpr auto append(const constexpr_string<M>& other) { constexpr_string<N + M> output(*this, size() + other.size()); // ^    . ^     output. for (std::size_t i = 0; i < other.size(); ++i) { output[size() + i] = other[i]; ^     output. } return output; } // ... }; 


рдЖрдкрдХреЛ рдпрд╣ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдлреАрд▓реНрдбреНрд╕ рдкреБрд░рд╕реНрдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдХрд╛рд░ N рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдЖрдХрд╛рд░ M рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рддреЛ рдЖрдХрд╛рд░ N + M рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрдирдХреЗ рд╕рдВрдШрдирди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧреАред рд╣рдо "рд╕рдВрдХрд▓рди-рд╕рдордп рднрдВрдбрд╛рд░" рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрд░реНрдмрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рд▓рд╛рдЗрдиреЗрдВ рдкреВрд░реА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рдХреАрдордд рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдореИрдВрдиреЗ std :: string_view рдХрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рднреА рд▓рд┐рдЦрд╛ рд╣реИ, рдЬрд┐рд╕реЗ constexpr_string_view рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрди рджреЛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде, рдореИрдВ рдЕрдкрдиреЗ рдЦреЗрд▓ рд░рд╛рдЬреНрдп рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдерд╛ред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реЛрдЪреЗрдВ:

 constexpr auto game_state = constexpr_string(тАЬ...something...тАЭ); //          : constexpr auto blue_gem = find_if(game_state.begin(), game_state.end(), [](char c) constexpr -> { return c == 'B'; } ); 

рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рдЧрд╣рдиреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдерд╛ - рд╡реИрд╕реЗ, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ C ++ 17 рдХреА рдПрдХ рдФрд░ рдХреАрдорддреА рд╡рд┐рд╢реЗрд╖рддрд╛ рджреЗрдЦреА рд╣реИ ?

рд╣рд╛рдБ! рдЗрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ constexpr_string рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдерд╛ред рдкрд╣рд▓реЗ, рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдерд╛ред рдЗрди рд╡реЗрджрдирд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо make_xxx рдлрд╝рдВрдХреНрд╢рдВрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реНрдХреЛрдВ рдиреЗ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЛ рдмреЗрд╣рддрд░ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ:

 template <int N> struct constexpr_string { constexpr_string(const char(&a)[N]) {} // .. }; // ****  C++17 **** template <int N> constexpr_string<N> make_constexpr_string(const char(&a)[N]) { //      N ^   return constexpr_string<N>(a); // ^    . } auto test2 = make_constexpr_string("blablabla"); // ^      . constexpr_string<7> test("blabla"); // ^      ,    . // ****  C++17 **** constexpr_string test("blabla"); // ^    ,  . 

рдХреБрдЫ рдХрдард┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рддрд░реНрдХреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рддрд░реНрдХ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдореИрдиреБрдЕрд▓ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВред

рдПрд╕рдЯреАрдПрд▓ рд╕реЗ рдореБрдлреНрдд рднреЛрдЬрди:


рдЦреИрд░, рд╣рдо рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рджрдо рдкрд░ рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╕рдорд┐рддрд┐ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдиреЗ рдЙрджрд╛рд░рддрд╛ рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреБрдЫ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ?

рдирдП рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░:

C ++ 17 рдореЗрдВ , std :: variant рдФрд░ std :: рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЛ рдорд╛рдирдХ рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдкрд╣рд▓рд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрдВ рдЯрд╛рдЗрдк-рд╕реЗрдл рдПрд╕реЛрд╕рд┐рдПрд╢рдиреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреАрд╕реАрд╕реА 7.2 рдХреЗ рд╕рд╛рде libstdc ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ std :: variant рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рддреНрдпрд╛рдЧ рджрд┐рдпрд╛ рдФрд░ рдХреЗрд╡рд▓ std :: рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдЯрд╛рдЗрдк рдЯреА рдХреЗ рд╕рд╛рде , рдкреНрд░рдХрд╛рд░ рдПрд╕рдЯреАрдбреА :: рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдПрд╕рдЯреАрдбреА :: рд╡реИрдХрд▓реНрдкрд┐рдХ <рдЯреА> рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдк рдЯреА рдХрд╛ рдореВрд▓реНрдп рдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдлреА рд╕рд╛рд░реНрдердХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ C # рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдореВрд▓реНрдп рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ред рдЖрдЗрдП find_in_board рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦреЗрдВ , рдЬреЛ рдХрд┐рд╕реА рдлрд╝реАрд▓реНрдб рдкрд░ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рд╣реА рд╣реИред рдореИрджрд╛рди рдкрд░ рдРрд╕рд╛ рдХреЛрдИ рддрддреНрд╡ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдерд┐рддрд┐ рдкреНрд░рдХрд╛рд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 template <class Predicate> constexpr std::optional<std::pair<int, int>> find_in_board(GameBoard&& g, Predicate&& p) { for (auto item : g.items()) { if (p(item)) { return {item.x, item.y}; } //   ,     . } return std::nullopt; //      . } auto item = find_in_board(g, [](const auto& item) { return true; }); if (item) { // ,   optional. do_something(*item); //    optional, ""   *. /* ... */ } 

рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╛ рддреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рдерд╛ , рдпрд╛ рд╕реАрдзреЗ рд╕реНрдерд┐рддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ "рдЦрд╛рд▓реА рд╕реНрдерд┐рддрд┐" рдЬреЛрдбрд╝рдирд╛ рдерд╛, рдпрд╛ рдмреВрд▓рд┐рдпрди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдирд╛ рдерд╛ ред рдмреЗрд╢рдХ, рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рдерд╛!

рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрдкреНрд░ рд╕рдкреЛрд░реНрдЯ рдорд┐рд▓рд╛ : рдЯрдкрд▓ рдФрд░ рдкреЗрдпрд░ ред рдореИрдВ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдиреА рдПрдХ рдирд┐рд░рд╛рд╢рд╛ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред рд╕рдорд┐рддрд┐ рдиреЗ рдПрдХ рдЯреНрдпреВрдкрд▓ рдпрд╛ рдпреБрдЧреНрдо рдореЗрдВ рдирд┐рд╣рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЪреАрдиреА рдХреЛ рдорд╛рдирдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ ред рдЗрд╕ рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ рд╕рдВрд░рдЪрд┐рдд рдмрдВрдзрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд┐рднрд╛рдЬрд┐рдд рдЯрдкрд▓ рдпрд╛ рдЬреЛрдбрд╝реА рдХреЛ рдХрд┐рд╕ рдЪрд░ рдкрд░ рд░рдЦрд╛ рдЬрд╛рдП :

 std::pair<int, int> foo() { return {42, 1337}; } auto [x, y] = foo(); // x = 42, y = 1337. 

рдмрд╣реБрдд рд╣реЛрд╢рд┐рдпрд╛рд░! рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╕рдорд┐рддрд┐ рдХреЗ рд╕рджрд╕реНрдп [рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗ, рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдереЗ, рд╕рдордп рдирд╣реАрдВ рдорд┐рд▓рд╛, рднреВрд▓ рдЧрдП] рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╡рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рдмрдирд╛ рджрд┐рдпрд╛ ред рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛:

 constexpr auto [x, y] = foo(); // OR auto [x, y] constexpr = foo(); 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрдЯрд┐рд▓ рдХрдВрдЯреЗрдирд░ рдФрд░ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?

рдПрд▓реНрдЧреЛрд░рд┐рджрдо:

рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдиреНрдирдпрди рдПрдХ рдмрд╣реБрдд рдиреАрд░рд╕ рдХрд╛рдо рд╣реИред рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЧреИрд░- рд╕рдВрд╢реЛрдзрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЬреАрдм рд╣реИ рдХрд┐ рд╕реА ++ 17 рдореЗрдВ рд╣рдордиреЗ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рдЧрддрд┐ рдирд╣реАрдВ рджреЗрдЦреА рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рд╕реА ++ 20 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрджреНрднреБрдд рдПрд╕рдЯреАрдбреА :: рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рдорд┐рд▓реЗ ред

рд▓реЗрдХрд┐рди рдбрд░реЛ рдордд! рдЬреИрд╕рд╛ рдХрд┐ рдмреЗрди рдФрд░ рдЬреЗрд╕рди рдиреЗ рд╕рдордЭрд╛рдпрд╛, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХреЙрдкреА рдХрд░рдХреЗ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдХреЙрдкреАрд░рд╛рдЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛); cppreference рдЕрдЪреНрдЫрд╛ рд╣реИред рджреЗрд╡рд┐рдпреЛрдВ рдФрд░ рд╕рдЬреНрдЬрдиреЛрдВ, рдореИрдВ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВconstexpr std :: рдЦреЛрдЬреЗрдВ :

 template<class InputIt, class T> constexpr InputIt find(InputIt first, InputIt last, const T& value) // ^ !!!    constexpr. { for (; first != last; ++first) { if (*first == value) { return first; } } return last; } //  http://en.cppreference.com/w/cpp/algorithm/find 

рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдХреВрд▓рди рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреА рдЪреАрдЦреЗрдВ рд╕реБрди рд╕рдХрддрд╛ рд╣реВрдВ! рд╣рд╛рдБ, рдХреЗрд╡рд▓ cppreference рджреНрд╡рд╛рд░рд╛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдП рдЧрдП рдирдореВрдирд╛ рдХреЛрдб рдХреЗ рд╕рд╛рдордиреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╣рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЖрджрд░реНрд╢ рдЧрддрд┐ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдореЗрдВ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЬрдм рд╕рдВрдХрд▓рди рдХреА рдЧрддрд┐ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ , рддреЛ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╕рд░реНрд╡реЛрддреНрддрдо рд╣реИрдВред

рдЧрддрд┐ рдФрд░ рдХреАрдбрд╝реЗ:


рдХрд┐рд╕реА рднреА рдПрдПрдП рдЧреЗрдо рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдирд┐рд╡реЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛?

рдЧрддрд┐:


рдЬрдм рдореИрдВ рдореЗрдЯрд╛ рдХреНрд░рд╢ рд╕рд╛рдЧрд╛ рдХрд╛ рдЖрдзрд╛ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ , рддреЛ рдХрд╛рдо рд╕реБрдЧрдо рд╣реЛ рдЧрдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ рд▓реИрдкрдЯреЙрдк рдкрд░ 3 рдПрдлрдкреАрдПрд╕ (рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб) рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде i5 рдУрд╡рд░рдХреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ 1.80 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬрд╝ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрд╡реГрддреНрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ)ред рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдЬрд▓реНрджреА рд╕реЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдХреЛрдб рдШреГрдгрд┐рдд рдерд╛, рдФрд░ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕_рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдорд╛рдирдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдиреЗ рдХреЛрдб рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛ рджрд┐рдпрд╛, рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдиреЗ рдЧрддрд┐ рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛; рдирдИ рдЫрдд 0.5 рдПрдлрдкреАрдПрд╕ рд╣реИ ред

C ++ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреБрд░рд╛рдиреА рдХрд╣рд╛рд╡рдд рдХреЗ рдмрд╛рд╡рдЬреВрдж, "рд╢реВрдиреНрдп-рд╕рд┐рд░ рдЕрдореВрд░реНрддрддрд╛рдПрдВ" рд╕рдВрдХрд▓рди-рд╕рдордп рдХреА рдЧрдгрдирд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рд╣реИ рдЕрдЧрд░ рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдХреБрдЫ "рд╕рдВрдХрд▓рди рд╕рдордп рдХреЛрдб" рдХреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рд╕реБрдзрд╛рд░ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрд╡рд╕рд░ рднреА рд╣реИрдВ, рдРрд╕реЗ рдХреЛрдб рдХреЗ рд▓реЗрдЦрдХред рдпрд╣рд╛рдБ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рдЕрдзреВрд░реА рд╕реВрдЪреА рд╣реИ, рдЬреЛ рд╕рдВрднрд╡рддрдГ GCC рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ:

  • C рд╕рд░рдгрд┐рдпрд╛рдБ std :: array рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ ред std :: array , C-style array рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЖрдзреБрдирд┐рдХ C ++ рдХреЙрд╕реНрдореЗрдЯрд┐рдХреНрд╕ рдХрд╛ рдПрдХ рд╕рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреАрдордд рдЪреБрдХрд╛рдиреА рд╣реЛрдЧреАред
  • , ( ) . , , , . : , , , , ( ) , .
  • , . , .
  • . GCC. , ┬л┬╗.

:



рдХрдИ рдмрд╛рд░ рдореЗрд░реЗ рд╕рдВрдХрд▓рдХ рдиреЗ рднрдпрд╛рдирдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрдЧрд▓ рджрд┐рдпрд╛, рдФрд░ рдореЗрд░реЗ рдХреЛрдб рддрд░реНрдХ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рд▓реЗрдХрд┐рди рдЙрд╕ рдЬрдЧрд╣ рдХреЛ рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ, рдЬрд╣рд╛рдВ рдмрдЧ рдЫрд┐рдк рд░рд╣рд╛ рд╣реИ? рдбрд┐рдмрдЧрд░ рдФрд░ рдкреНрд░рд┐рдВрдЯрдл рдХреЗ рдмрд┐рдирд╛ , рдЪреАрдЬреЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреА рд░реВрдкрдХ "рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рджрд╛рдврд╝реА" рдЕрднреА рддрдХ рдЕрдкрдиреЗ рдШреБрдЯрдиреЛрдВ рддрдХ рдирд╣реАрдВ рдмрдврд╝реА рд╣реИ (рджреЛрдиреЛрдВ рд░реВрдкрдХ рдФрд░ рдореЗрд░реА рдЕрд╕рд▓реА рджрд╛рдврд╝реА рдЕрднреА рднреА рдЗрди рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ), рддреЛ рд╢рд╛рдпрдж рдЖрдкрдХреЗ рдкрд╛рд╕ рдЯреЗрдВрдкрд▓рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ рд╕рдВрдХрд▓рдХ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдкреНрд░реЗрд░рдгрд╛ рдирд╣реАрдВ рд╣реИ ред

рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ рджреЛрд╕реНрдд static_assert рд╣реЛрдЧрд╛ , рдЬреЛ рд╣рдореЗрдВ рд╕рдВрдХрд▓рди рд╕рдордп рдХреЗ рдмреВрд▓рд┐рдпрди рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рджреВрд╕рд░рд╛ рдорд┐рддреНрд░ рдПрдХ рдореИрдХреНрд░реЛ рд╣реЛрдЧрд╛ рдЬреЛ рдЬрд╣рд╛рдВ рднреА рд╕рдВрднрд╡ рд╣реЛ, рд╡рд╣рд╛рдВ рдХрдмреНрдЬреЗ рдХреЛ рд╕рдХреНрд╖рдо рдФрд░ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ:

 #define CONSTEXPR constexpr //      //  #define CONSTEXPR //     

рдЗрд╕ рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде, рд╣рдо рддрд░реНрдХ рдХрд╛рд░реНрдп рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдбрд┐рдмрдЧрд░ рдХреЛ рдЗрд╕рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрдЯрд╛ рдХреНрд░рд╢ рд╕рд╛рдЧрд╛ II - рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЧреЗрдордкреНрд▓реЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:


рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдореЗрдЯрд╛ рдХреНрд░рд╢ рд╕рд╛рдЧрд╛ рдЗрд╕ рд╕рд╛рд▓ рдж рдЧреЗрдо рдЕрд╡рд╛рд░реНрдбреНрд╕ рдирд╣реАрдВ рдЬреАрддреЗрдЧреА ред рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЧреЗрдордкреНрд▓реЗ рдХреЛ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрд╣ рд╣рд╛рд░реНрдбрдХреЛрд░ рдЧреЗрдорд░реНрд╕ рдХреЛ рдирд╛рд░рд╛рдЬрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ... рдореИрдВ рдмрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддрд╛ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдФрд░ рдЕрд╢реБрджреНрдз рддрд░реНрдХ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдФрд░ рдпрд╣ рдлреНрд░реИрдВрдХ рдкрд╛рдЧрд▓рдкрди рд╣реИ!)ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдПрдХ рджрд┐рди рдореИрдВ рд░реЗрдВрдбрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреНрдпрд╛рдЧрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛ рдФрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВрдВрдЧрд╛ :


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

рдкрджрд╛рд╡рдирдд рдХреА рдЧрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ :

 template <char... words> struct useless { [[deprecated]] void call() {} // Will trigger a warning. }; template <char... words> void output_as_warning() { useless<words...>().call(); } output_as_warning<'a', 'b', 'c'>(); // warning: 'void useless<words>::call() [with char ...words = {'a', 'b', 'c'}]' is deprecated // [-Wdeprecated-declarations] 

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреЛрдб рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реИ! рдпрджрд┐, рд╢реБрджреНрдз рд╕рдВрдпреЛрдЧ рд╕реЗ, рдЖрдк C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдПрдХ рдЧреБрдкреНрдд рд╕рдорд╛рдЬ рдХреЗ рд╕рджрд╕реНрдп рд╣реИрдВ, рдЬреЛ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЖрдкрдХреА рдЯреАрдо рдХреЛ рд╕рд╣реА рдореЗрдЯрд╛ рдХреНрд░рд╢ рд╕рд╛рдЧрд╛ II рдмрдирд╛рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА !

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


рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдШреЛрдЯрд╛рд▓рд╛ рдЦреЗрд▓ рдмреЗрдЪрдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдкреЛрд╕реНрдЯ рдЙрддреНрд╕реБрдХ рд▓рдЧреА рд╣реЛрдЧреА рдФрд░ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрдиреЗ рдХреЛ рдорд┐рд▓реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рд▓реЗрдЦ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рддрд░реАрдХреЗ рдвреВрдВрдврддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВред

рдореИрдВ рд╕реНрд╡реАрдбрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреАрдо рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдЙрдирдХреЗ рдХрд┐рд╕реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рджрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдЧреБрд░рджреЗрд╡ рдХреЗ рдкреНрд░рддрд┐ рдЕрдкрдиреА рдЧрд╣рд░реА рдХреГрддрдЬреНрдЮрддрд╛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ , рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдореЗрдЯрд╛ рдХреНрд░рд╢ рдЧрд╛рдЧрд╛ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реБрдУрдВ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХреА ред

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


All Articles