
C ++ 11 рдорд╛рдирдХ рдХреЛ рдорд╛рд╣рд┐рд░ рдХрд░рдирд╛ рдПрдХ рдРрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рд╕реНрдкреИрд╕реНрдореЛрдбрд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рди рдХреЗрд╡рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдФрд░ рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЛрдВ рдХреЛ рднреА рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛ред рд╕реАрдЦрдиреЗ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорджрдж рдПрдХ рдкреНрд░реАрдЯрд┐рдпрд░ рдПрд╕рдЯреАрдПрд▓ рд╣реИ, рдЬреЛ рдЕрдХреНрд╕рд░ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдЖрдБрдЦреЗрдВ рдЦреЛрд▓ рд╕рдХрддреА рд╣реИред рдФрд░ рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдПрд╕рдЯреАрдПрд▓ рдореЗрдВ рдХреБрдЫ рдЪреАрдЬ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЧрдИ рд╣реИ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЖрд╕рд╛рди рд╣реИред
рдЕрджреНрдпрддрди рдФрд░ рдмреЗрд╣рддрд░
рдЬреЛрдбрд╝реА рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдирдП рдорд╛рдирдХ рдиреЗ
рдЬреЛрдбрд╝реА , рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рд╕рд░рд▓ рдЪреАрдЬреЗрдВ рдЬреЛрдбрд╝ рджреАрдВред рдкрд╣рд▓реЗ, рдмрд▓реНрдХрд┐ рдХрдареЛрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдЬреЛрдбрд╝реА рдмрдирд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ рдЬреЛрдбрд╝реА рдореЗрдВ рдврд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдХреЙрдкреА рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд╕реАрдзреЗ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рджрд╕реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЬреЛрдбрд╝реА рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдПрдордкреНрд▓реЗрд╕, "рдкреНрд▓реЗрд╕рдореЗрдВрдЯ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реА ++ 11 рдореЗрдВ рдпрд╣ рдПрд╕рдЯреАрдПрд▓ рдХрдВрдЯреЗрдирд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ), рдЧреИрд░-рддреБрдЪреНрдЫ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ред
... рдФрд░ рдпрд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗред рд╣рдо
рдЬреЛрдбрд╝реА рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХреИрд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рджреЛ рд╕реЗрдЯ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖ рдЬрд╛рдП рдХрд┐ рдХрд┐рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреМрди рд╕реЗ рддрд░реНрдХ рджреЗрдиреЗ рд╣реИрдВ? рд╕рджрд╕реНрдпреЛрдВ рдпрд╛ рдПрдХ рдкреВрд░реА
рдЬреЛрдбрд╝реА рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдпрд╛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ:
template< class... Args1, class... Args2 > pair( std::piecewise_construct_t, std::tuple<Args1...> first_args, std::tuple<Args2...> second_args );
piecewise_construct_t рд╕рд┐рд░реНрдл рдПрдХ рдЦрд╛рд▓реА рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рд╣рдо
рдкрд╣рд▓реЗ рдФрд░
рджреВрд╕рд░реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЛ рддрд░реНрдХ рджреЗрддреЗ рд╣реБрдП,
рдЯреБрдХрдбрд╝рд╛ рдХрд░рдХреЗ рдПрдХ
рдЬреЛрдбрд╝реА рдЯреБрдХрдбрд╝рд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ
рдЯреБрдХрдбрд╝рд╛ рдЬрд┐рд╕реЗ
piecewise_construct рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред рдЦреИрд░, рдлрд┐рд░ рд╣рдо рддрд░реНрдХреЛрдВ рдХреЗ рджреЛ рд╕реЗрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ
рдЯреБрдкрд▓реНрд╕ рдореЗрдВ
рдмрд╛рдБрдзрддреЗ рд╣реИрдВ (
рдЯрдкрд▓ ,
рдореЗрдХ_рдЯреБрдкрд▓ рдлрд╝рдВрдХреНрд╢рди рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛)ред рдЙрди рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рднреВрд▓ рдЧрдП рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рд╣реИ: рдПрдХ рдЯреНрдпреВрдкрд▓ рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред C ++ рдореЗрдВ, рдЗрд╕рдХреЗ рд╕рдЦреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде, рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЛ рд╡реЗрд░рд┐рдПрдмрд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рддрд░реНрдХ (
рд╡реЗрд░рд┐рдПрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ ) рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдареАрдХ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ: рдЯреБрдкрд▓реНрд╕
рдкрд╣рд▓реЗ рдФрд░
рджреВрд╕рд░реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рддрд░реНрдХреЛрдВ рдХреЗ "рдкреИрдХреЗрдЬ" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬреЛ рдирдП рдорд╛рдирдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╢реНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: "рд╡реИрд╕реЗ, рдЯреБрдкрд▓реНрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдЕрдирдкреИрдХ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ?" рдкреНрд░рд▓реЗрдЦрди рд╣рдореЗрдВ рдПрдХ рд╣реА рд░рд╛рд╕реНрддрд╛ рджреЗрддрд╛ рд╣реИ:
рдкреНрд░рд╛рдкреНрдд рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреНрдпреВрдкрд▓ рдореЗрдВ рддрддреНрд╡ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╣рдорд╛рд░реЗ рддрд░реНрдХ рдХреИрд╕реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ? рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдЯрдкрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЙрдиреНрд╣реЗрдВ рдкреБрди: рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░) рдореЗрдВ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдлрд┐рдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП?
рдЕрдирдкреИрдХрд┐рдВрдЧ рд╡реИрд░реЗрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдирдкреИрдХрд┐рдВрдЧ
рдЯрдкрд▓ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рд╕реВрдЪреА рд╣реИред рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рдЕрднреА рднреА рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдЪрд▓реЛ рдореБрдЦреНрдп рдПрдХ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: рдЖрдЗрдП рдореМрдЬреВрджрд╛ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдЬреЛрдбрд╝реЗрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрджрд┐ рдирдВрдмрд░ 0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдЗрдирдкреБрдЯ рд╕реВрдЪреА рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред рд╣рдореЗрдВ рдПрдХ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдорд╛рдирдХреАрдХреГрдд рдХрд░реЗрдВ:
template<size_t ... Indices> struct PackIndices {
рдкрд░рд┐рдгрд╛рдо, рдЬреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдФрд░ рдЙрд╕реА рд╕рдордп, рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ, рдЕрдкрдиреЗ рджрдо рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрди рддрд░реНрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИ:
template<size_t ... Indices> struct PackIndices { typedef PackIndices<Indices... , sizeof ... (Indices)> next; };
рдЕрдм рдЪрд▓реЛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд▓рдВрдмрд╛рдИ
рдПрди рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИ
ред рдпрд╣ рд▓рдВрдмрд╛рдИ
рдПрди -1 рдХреА рд╕реВрдЪреА рдореЗрдВ рдЕрдВрддрд┐рдо рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
template<size_t N> struct CreatePackIndices { typedef typename CreatePackIndices<N-1>::type::next type; };
... рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд░реЛрдХреЗрдВ:
template<> struct CreatePackIndices<0> { typedef PackIndices<> type; };
рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдирд┐рд░реНрдорд╛рдг рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдЯрдкрд▓ рдХреЛ рдЦреЛрд▓ рджреЗрдВрдЧреЗред рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ,
рдкрд╣рд▓реЗ ред
рдЖрд░реНрдЧрдиреНрд╕ рдЯрдкрд▓ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдЗрдВрдбреЗрдХреНрд╕ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
first(std::get<Indices>(args)...)
рдЗрдВрдбрд┐рд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣рдо рдЕрдирдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ (рд╡рд╣ рд╣реИ,
рдЬреЛрдбрд╝реА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░) рдЗрд╕ рд╕реВрдЪреА рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рджреВрд╕рд░рд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░-рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ, рд╡реИрд╕реЗ, рдПрдХ рдФрд░ рд╕реА ++ 11 рдирд╡реАрдирддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЖрд░рдВрднреАрдХрд░рдг рд╕реВрдЪреА рдореЗрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдФрд░ рдЪреВрдВрдХрд┐ рд╣рдо рдЕрднреА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рддрд░реНрдХ рдХрд╛ рд╕реНрд╡рдд: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ: рд╣рдо рд╕рд╣рд╛рдпрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ
рд▓рд┐рдП рдЕрдирд╛рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
PackIndices рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдПрдХ рдкреИрд░ рд╡рд╛рд▓реА
рдЬреЛрдбрд╝реА рдорд┐рд▓рддреА рд╣реИ:
template<typename T> class pair { // , template<typename ... ArgTypes, size_t ... Indices> pair(std::tuple<ArgTypes...>& first_args, PackIndices<Indices...>): first(std::get<Indices>(first_args)...) {} public: // , template<typename ... ArgTypes> pair(std::piecewise_construct_t, const std::tuple<ArgTypes...>& first_args): pair(first_args, typename CreatePackIndices<sizeof ... (ArgTypes)>::type()) {} private: T first; };
рдпрд╣рд╛рдВ
рд╕рд╣реА рдЕрдЧреНрд░реЗрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ - рддрдВрддреНрд░ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рддрд░реНрдХ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдПрд╕рдЯреАрдПрд▓ рдореЗрдВ,
рдлрд╝реЙрд░рд╡рд░реНрдб рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрд░реНрдХ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдирдП рдорд╛рдирдХ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреЗрдЪреАрджрд╛ рдХрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИ,
рд╕рд╛рде рд╣реА рд╕рд╛рде рддрд░реНрдХреЛрдВ рдХреЗ рдХрдИ рд╕реЗрдЯреЛрдВ рдХреЛ
рдПрдХ рд╕рд╛рде рдЦреЛрд▓рдирд╛ рднреА рд╣реИред рдЪреВрдВрдХрд┐
ArgTypes рдФрд░
Indices рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рд▓рдВрдмрд╛рдИ рд╣реИ, рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ
рдЕрдирдкреИрдХрд┐рдВрдЧ рдкреИрдЯрд░реНрди рдореЗрдВ рдПрдХ
рдлреЙрд░рд╡рд░реНрдб рдХреЙрд▓ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
template<typename ... ArgTypes, size_t ... Indices> pair(std::tuple<ArgTypes...>& first_args, PackIndices<Indices...>): first(std::forward<ArgTypes>(std::get<Indices>(first_args))...) {}
рдирд┐рд░реНрдорд╛рдг рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ
make_tuple рдХреЗ рдорд╛рдиреЛрдВ рд╕реЗ рд╕рднреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рджреЛрдиреЛрдВ рдкреИрд░реЛрдВ рдкрд░
рдЬреЛрдбрд╝реА рд░рдЦреЗрдВ :
рдХреЛрдб template<typename T1, typename T2> class pair { // , template<typename ... ArgTypes1, size_t ... Indices1, typename ... ArgTypes2, size_t ... Indices2> pair(std::tuple<ArgTypes1...>& first_args, std::tuple<ArgTypes2...>& second_args, PackIndices<Indices1...>, PackIndices<Indices2...>): first(std::forward<ArgTypes1>(std::get<Indices1>(first_args))...), second(std::forward<ArgTypes2>(std::get<Indices2>(second_args))...) {} public: // , template<typename ... ArgTypes1, typename ... ArgTypes2> pair(std::piecewise_construct_t, std::tuple<ArgTypes1...> first_args, std::tuple<ArgTypes2...> second_args): pair(first_args, second_args, typename CreatePackIndices<sizeof ... (ArgTypes1)>::type(), typename CreatePackIndices<sizeof ... (ArgTypes2)>::type()) {} private: T1 first; T2 second; };
рдмреЗрд╢рдХ, рдпрд╣ рддрдХрдиреАрдХ рди рдХреЗрд╡рд▓ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рд╛рдЗрдХрд┐рд▓
рдЬреЛрдбрд╝реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рддреЛ,
рд╕реНрдЯреИрдХреНрдб рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕рдВрднрд╡рддрдГ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдХреЗ рд╕рд╛рде рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдПрдЧрд╛ред рдирд┐рд╕реНрд╕рдВрджреЗрд╣, рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЖрд╡реЗрджрди рд╣реЛрдВрдЧреЗред