рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдЬреАрд╡рди

рд▓реЗрдЦ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣реА рд╣реИред

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

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

рдЬреЙрди рдХреЙрдирд╡реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рд┐рджреНрдз рдЦреЗрд▓ "рд▓рд╛рдЗрдл" рдХреЗ рдХрдИ рдЕрд╣рд╕рд╛рд╕ рд╣реИрдВ, рдкрд╛рдЧрд▓ рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЙрди рд╕рднреА рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдШрд╛рддрдХ рджреЛрд╖ рд╣реИ: рдЬреАрд╡рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрдгрдирд╛ рд╕реАрдзреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдХреА рдЬрд╛рддреА рд╣реИ ред рдЪрд▓реЛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред

рдкреИрдЯрд░реНрди рдХреНрдпрд╛ рд╣реИрдВ


рдпрд╣ рдПрдХ рднрд╛рд╖рд╛ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ \ _ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЬреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ - рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╡рд╛рдВрдЫрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рд╕рдВрдХрд▓рдХ, рдЯреЗрдореНрдкрд▓реЗрдЯ рджреНрд╡рд╛рд░рд╛, рд╕рдВрдмрдВрдзрд┐рдд рдЗрдХрд╛рдИ рдмрдирд╛рдПрдЧрд╛ред

template <typename T> class SomeClass { T i; }; template <class T> // class  тАФ   ,   typename! T sum( T a, T b ) { return a + b; } SomeClass<int> obj_1; SomeClass<double> obj_1; double i = sum<double>( 3.14, 15.9 ); 

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

рдЖрдк "рднрд░рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ" рд╡рд░реНрдЧ рдХреЗ рдЯрд╛рдЗрдк рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рдордиреЗ рдорд┐рд╕реНрдб рдЬрдЧрд╣ рдХреЗ рдирд╛рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ, рдпрд╛ рд╕реАрдзреЗ рдХреНрд▓рд╛рд╕ рдХреЗ рдЯрд╛рдЗрдкрдиреЗрдо рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ рдЯрд╛рдЗрдк рдХрд░рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рднрд╛рд╖рд╛ рдореЗрдВ рдЯрд╛рдЗрдкрдиреЗрдо рдФрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рдЕрд░реНрде рд╣реИ, рдЖрдк рдХреЛрдб рдХреА рд╕рдордЭ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд┐рдд рдореЗрдВ рдЕрдВрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдкрдиреЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рди рдХреЗрд╡рд▓ рдЬрдЯрд┐рд▓, рдмрд▓реНрдХрд┐ рд╕рд░рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рднреА рдорд╛рдкрджрдВрдбреЛрдВ (рд╕рд╛рджреЗ рдкреБрд░рд╛рдиреЗ) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдбреЗрдЯрд╛), рдФрд░ рд╡рд░реНрдЧ - рдЬрд╣рд╛рдВ рдмреЗрд╣рдж рдЬрдЯрд┐рд▓ "рд╡рдпрд╕реНрдХ" рдХрдХреНрд╖рд╛рдПрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВред

рдХреНрдпрд╛ рд╡рд╣ рд╕рдм рд╣реИ?


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рд╛рдВ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдпрд╣ рднреА рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ C ++ 11 рдорд╛рдирдХ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рд╡рд╛рд▓реЗ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред

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

 // ,  "" тАФ      typedef std::vector<string> Strings; //  using Strings = std::vector<string>; //  //     typedef void (*FunctionType)(double); //    using FunctionType = void (*)(double); // FunctionType тАФ   ,  double,  void // ,   тАФ   ,    T template <typename T> typedef Matrix<T, 3> Cube<T>; //   template <typename T> using Cube = Matrix<T, 3>; //  

рдЗрд╕рд▓рд┐рдП, рдЯрд╛рдЗрдкрд┐рдВрдЧрдбрд┐рдл рдХрд╛ рдЕрдзрд┐рдХ рд╕рдордЭ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЯрд╛рдЗрдкреНрдбрд┐рдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦреЗрдВред

рдЬреАрд╡рди рдХреНрдпрд╛ рд╣реИ?


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

рдЖрдЗрдП рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ: рдЬреАрд╡рди рдХреЗ рд▓рд┐рдП, рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕ рд╕реНрдерд╛рди рдкрд░ рд╡реЗ рд╕реНрдерд┐рдд рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреА рдЕрдЧрд▓реА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛, рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред

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

рд╣рдо рдЬреАрд╡рди рдХреЛ рдЬрдиреНрдо рджреЗрддреЗ рд╣реИрдВ


рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╕реЗрд▓ рдереА:

 struct O { }; // dead struct X { }; // alive 

рдФрд░ рд╕реЗрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА:

 template <typename T> //   тАФ   constexpr bool is_alive(); template<> //      constexpr bool is_alive<O>() { return false; } template<> //     X constexpr bool is_alive<X>() { return true; } 

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

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

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

рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдореМрдХрд╛ рд╣реИ рдЬреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рджред

рд╢рд░реНрддреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛

рд╣рдо рдкрд╣рд┐рдпрд╛ рдХреЛ рд╕реБрджреГрдврд╝ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрд╕рдЯреАрдПрд▓, рдЦреЗрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдЯрдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ - рд╕реНрдерд┐рд░рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛:

 using start = tuple< O, O, O, O, O, O, O, X, O, O, O, O, O, X, O, O, X, X, X, O, O, O, O, O, O >; //   const int width = 5; const int height = 5; const int iterations = 20; 

tuple - рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╖рдо рд╕рд░рдгреАред рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рд╣рдо рдХреЗрд╡рд▓ рдЯреБрдкрд▓ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдУ рдФрд░ рдПрдХреНрд╕ рд╣реИрдВред рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЗрдХрдЯреНрдареЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИрдВ, рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реИрдВред

рдЬреАрд╡рд┐рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЧрд┐рдирддреА

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

 template <typename tuple, int N> struct tuple_counter { constexpr static int value = is_alive<typename tuple_element<N, tuple>::type>() + tuple_counter<tuple, N-1>::value; }; template <typename tuple> //      N = 0 struct tuple_counter<tuple, 0> { constexpr static int value = is_alive<typename tuple_element<0, tuple>::type>(); }; 

рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдкреНрд░рддреНрдпрд╛рд╡рд░реНрддрди! рдЖрдЗрдП рдХрд░реАрдм рд╕реЗ рджреЗрдЦреЗрдВ:

 constexpr static int value = is_alive<typename tuple_element<N, tuple>::type>() + // тАж 

рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рд╕реЗ рдорд┐рд▓ рдЪреБрдХреЗ рд╣реИрдВ - рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рд╕рдВрдХрд▓рди рд╕реНрддрд░ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рд╕реНрдерд┐рд░ рд╣реЛрддреА рд╣реИред
tuple_element <N, tuple> - рдЬрд╛рд╣рд┐рд░ рд╣реИ, tuple рд╕реЗ Nth рддрддреНрд╡ рдХрд╛ рдЪрдпрди, STL рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЕрд╡рд╕рд░ред

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

 тАж + tuple_counter<tuple, N-1>::value; 

рдФрд░ рдпрд╣рд╛рдБ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реА рд╣реИред рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, tuple_counter рд╕рдорд╛рди tuple_counter рдХреЗ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ 1 рдХрдо рдХреЗ рд╕рд╛рдеред рд░рд┐рдХрд░реНрд╕рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рддрдм рд╣реЛрдЧрд╛ рдЬрдм N 0. рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдХрдВрдкрд╛рдЗрд▓рд░ N = 0 рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ tuple_counter рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рд░рд┐рдХрд░реНрд╕рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред рд╣реЛ рдЧрдпрд╛ред

рдЦреЗрд▓ рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рдЧрдгрдирд╛, рд╕рд╛рде рд╣реА рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ, рдЙрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкреБрдирд░рд╛рд╡рд░реНрддреАред

рдХреЛрд╢рд┐рдХрд╛ рдХреА рдЕрдЧрд▓реА рдЕрд╡рд╕реНрдерд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг

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

 template <typename point, typename neighbors> struct calc_next_point_state { constexpr static int neighbor_cnt = tuple_counter<neighbors, tuple_size<neighbors>() - 1>::value; using type = typename conditional < is_alive<point>(), typename conditional < (neighbor_cnt > 3) || (neighbor_cnt < 2), O, X >::type, typename conditional < (neighbor_cnt == 3), X, O >::type >::type; }; 

рдЯрд░реНрдиреЗрд░реА рдСрдкрд░реЗрдЯрд░ X рдХрд╛ рд╕рд╢рд░реНрдд рдПрдирд╛рд▓реЙрдЧ? Y: Z. рдпрджрд┐ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рд╕рд╣реА рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░, рдЕрдиреНрдпрдерд╛ рддреАрд╕рд░рд╛ рд╣реИред рдмрд╛рдХреА рдХреЛрдб, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЕрдм рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди

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

 template <typename initial_state> struct level { template <int N> //     using point = typename tuple_element<N, initial_state>::type; template <int N> // (  )     using neighbors = tuple< point< /* */ >, ... >; template <int N> //     using next_point_state = typename calc_next_point_state<point<N>, neighbors<N>>::type; }; 

рдкрдбрд╝реЛрд╕реА рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдЧрд▓рддрд┐рдпрд╛рдВ рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ - рдпрджрд┐ рдЖрдк рдЯреНрдпреВрд▓ рд╕реЗ рдкрд░реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд▓рдЧрднрдЧ 56 рдЕрд╕реНрдкрд╖реНрдЯ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓реЗрдВрдЧреА, рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рдЕрдЧрд▓реЗ рдХреНрд╖реЗрддреНрд░ рд░рд╛рдЬреНрдп рдХреА рдЧрдгрдирд╛

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

рдХреНрдпрд╛ рдХрд░реЗрдВ? Tuple_cat рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдПрдХ рдореЗрдВ рдХрдИ tuple рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд╖рд╛ рддрдВрддреНрд░ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, tuple_cat tuple рдорд╛рди рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░, рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЖрдк рдПрд╕рдЯреАрдПрд▓ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ tuple_cat рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ tupleciped рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░реЗрдВ, рдпрд╛ рдЙрдкрд▓рдмреНрдз рднрд╛рд╖рд╛ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдШреЛрд╖рдгрд╛рдкрддреНрд░ рдСрдкрд░реЗрдЯрд░ C ++ 11 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдЕрд░реНрде рд╣реИ "рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛"ред рд╣рдо рдЗрд╕реЗ tuple_cat рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ ... рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ tuple_cat рдЕрднреА рднреА рдирдВрдЧреЗ рдкреНрд░рдХрд╛рд░ "tuple" рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд╣рд░ рдЬрдЧрд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди tuple рдХрд╛ рдорд╛рдиред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, C ++ рдореЗрдВ рдПрдХ рдШреЛрд╖рдгрд╛ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдпрд╣ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдореВрд▓реНрдп рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрддрдирд╛ рд╣реА рдХрд╛рдлреА рд╣реИред

 template <typename tuple_1, typename tuple_2> struct my_tuple_cat { //     tuple_cat,        tuple,    ? using result = decltype( tuple_cat( declval<tuple_1>(), declval<tuple_2>() ) ); }; 

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

 template <typename field, int iter> struct next_field_state { template<int N> using point = level<field>::next_point_state<N>; using next_field = typename my_tuple_cat < tuple< point<point_count - iter> >, typename next_field_state<field, iter-1>::next_field >::result; }; template <typename field> struct next_field_state<field, 1> { template<int N> using point = level<field>::next_point_state<N>; using next_field = tuple< point<point_count - 1> >; }; 

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

рдЖрдЙрдЯрдкреБрдЯ рдкрд░рд┐рдгрд╛рдо

рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛрдИ рдирдпрд╛ рдЬреНрдЮрд╛рди рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рд▓рд╛рддрд╛ рд╣реВрдВред

рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди
 template <typename Type> void print(); template<> void print<O>() { cout << "O"; } template<> void print<X>() { cout << "X"; } template <typename tuple, int N> struct Printer { static void print_tuple() { Printer<tuple, N-1>::print_tuple(); if( N % width == 0 ) cout << endl; print<typename tuple_element<N, tuple>::type>(); } }; template <typename tuple> struct Printer<tuple, 0> { static void print_tuple() { print<typename tuple_element<0, tuple>::type>(); } }; template <typename field, int iters> struct game_process { static void print() { Printer< field, point_count - 1 >::print_tuple(); cout << endl << endl; game_process< typename next_field_state<field, point_count>::next_field, iters-1 >::print(); } }; template <typename field> struct game_process<field, 0> { static void print() { Printer< field, point_count - 1 >::print_tuple(); cout << endl; } }; 


рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ


рдпрд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреНрд╖реЗрддреНрд░, рд╕реНрд░реЛрдд рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЬреАрд╡рди рдореЗрдВ рд╕рд╛рдВрд╕ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЬреАрд╡рди рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

 int main() { game_process< start, iterations >::print(); return 0; } 

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

рдЬреАрд╡рди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рд╕рдВрдкреВрд░реНрдг рднрд╛рд╖рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЦреЗрд▓ рдЬреАрд╡рди рдореЗрдВ, рд╕реА + + 11 рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рдЬреАрд╡рди рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рд╕реА ++ 11 рд╕рдВрдХрд▓рдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИ ... рдореИрдВ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЕрдорд░ рдкрд╛рдардХреЛрдВ рдХреЛ рдКрдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред

GitHub рдкрд░ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреГрд╖реНрдаред
рд╕рдВрджрд░реНрдн: C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ, 4th рдПрдбрд┐рд╢рди ред

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


All Articles