C ++ 0x рдореЗрдВ рд╡реИрд░реЗрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ

рдЬреЛ рд▓реЛрдЧ рдЖрдВрджреНрд░реЗрдИ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ "рдореЙрдбрд░реНрди рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рдХреА рдХрд┐рддрд╛рдм рдкрдврд╝рддреЗ рд╣реИрдВ, рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╢реНрд░реЗрдгреА рд╣реИ (рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ), рдЬрдм рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдЪрд░ (рдкреВрд░реНрд╡ рдЕрдЬреНрдЮрд╛рдд) рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг:

- рдЯреБрдкрд▓реНрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг

- рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддрд░рд╣ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг

- рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рддрд░реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ)

- рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реЗрдЯреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд░реНрдЧреАрдХрд░рдг

- рдЖрджрд┐ред



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

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





рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ



рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдШреЛрд╖рдгрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо ... рдкреНрд░рдХрд╛рд░>

рд╡рд░реНрдЧ VariadicTemplate

{

};



рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:

рдЯреЗрдореНрдкрд▓реЗрдЯ < int ... рд╕реНрдпрд╛рд╣реА>

рд╡рд░реНрдЧ VariadicTemplate

{

};



рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд░реНрддрдорд╛рди рдорд╛рдирдХ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИ (рдпрджрд┐ рдпрд╣ рдХрд╣рдирд╛ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ)ред

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

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдирд╛рдо ... рдЯрд╛рдЗрдк>

рд╢реВрдиреНрдп рдкреНрд░рд┐рдВрдЯрдлрд╝ ( рдХрд╛рд╕реНрдЯ рдЪрд╛рд░ * рдкреНрд░рд╛рд░реВрдк, рдкреНрд░рдХрд╛рд░ ... рдЖрд░реНрдЧреНрд╕);



рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ (рдЙрдиреНрд╣реЗрдВ "рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХ" рдпрд╛ "рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдЬрд╣рд╛рдВ рднреА рдирд┐рдпрдорд┐рдд (рдПрдХрд▓) рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



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



Types ...







рдкреНрд░рдХрд╛рд░ рдХрд╣рд╛рдБ рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдХрд╛ рдирд╛рдо рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рдгрд╛:

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо ... рдкреНрд░рдХрд╛рд░>

рд╡рд░реНрдЧ VariadicTemplate

{

};



рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

рд╡рд░реНрдЧ VariadicTemplate: рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рдХрд╛рд░ ... // рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ред 'рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рдХрд╛рд░' - рдкреИрдЯрд░реНрди

{

// ...

// рджреВрд╕рд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ред рдкреИрдЯрд░реНрди - рдкреНрд░рдХрд╛рд░

typedef OtherVariadicTemplate <рдкреНрд░рдХрд╛рд░ ...> OtherVT;

// рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд┐рдХрд▓реНрдкред рдкреИрдЯрд░реНрди - рдкреНрд░рдХрд╛рд░ *

typedef OtherVariadicTemplate <рдкреНрд░рдХрд╛рд░ * ...> SomeOtherVT;

// рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ред рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реИ, рдПрдХ args рдПрдХ рдирдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рд╣реИ:

рд╢реВрдиреНрдп рдСрдкрд░реЗрдЯрд░ () (рдкреНрд░рдХрд╛рд░ ... arg)

{

// рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рддрд░реНрдХ рд╕реВрдЪреА рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛

foo (& args ...);

}

// рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рд╕реВрдЪреА рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░:

VariadicTemplate (): рдкреНрд░рдХрд╛рд░ () ...

};



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

/ * ... * / рд╡рд╛рд░рд┐рдпрдбрд┐рдХреНрдЯреЗрдордкреНрд▓реЗрдЯ < int , char , double > / * ... * /



рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЦреБрд▓рд╛рд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

рд╡рд░реНрдЧ VariadicTemplate: рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ int , рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЪрд╛рд░ , рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбрдмрд▓

{

// ...

typedef OtherVariadicTemplate < int , char , double > OtherVT;

typedef OtherVariadicTemplate < int *, char *, double *> SomeOtherVT;

рд╢реВрдиреНрдп рдСрдкрд░реЗрдЯрд░ () ( int args1, char args2, рдбрдмрд▓ args3)

{

foo (& args1, & args2, & args3);

}

VariadicTemplate (): int (), char (), рдбрдмрд▓ () // рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛

};



рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

# < iostream > рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ



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

// рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо ... рдЖрд░реНрдЧреНрд╕> рд╕рдВрд░рдЪрдирд╛ рдлрдВрдХреНрд╢рдирд▓рдЗрдореНрдкреНрд▓;



// рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдХрд░реЗрдВред рдЙрд╕реА рд╕рдордп, рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдореЗрдВ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ

// рдорд╛рди (R) рдФрд░ рддрд░реНрдХ (Args)ред рдЗрди рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ (рд╕рд░рд▓ рдФрд░ рдмреИрдЪ) рд╕реЗ, рд╣рдо рддрдм рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рддреЗ рд╣реИрдВ

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо R, рдЯрд╛рдЗрдкрдиреЗрдо ... Args>

рд╕рдВрд░рдЪрдирд╛ рдлрдВрдХреНрд╢рдирд▓рдЗрдореНрдкреНрд▓ <R (Args ...)>

{

// рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реВрдЪрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдкреИрдХреЗрдЬ рдЦреЛрд▓реЗрдВ

рдЯрд╛рдЗрдкрдбрд┐рдл рдЖрд░ (* рдПрдлрдЯреА) (рдЖрд░реНрдЧреНрд╕ ...);



рдлрд╝рдирд┐рдпреЛрд░рд┐рдВрдкреНрд▓ (рдПрдлрдЯреА fn): m_fn (fn) {;}



// рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓реЗ рдЬрд╛рдП

// рд╕рдВрдЧреНрд░рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ред

рдЖрд░ рдСрдкрд░реЗрдЯрд░ () (Args ... args)

{

// рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рддреЗ рд╣реИрдВ

рд╡рд╛рдкрд╕реА m_fn (args ...);

}



рдПрдлрдЯреА m_fn;

};



// рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЗрд╖рдг рдкреИрдЯрд░реНрди рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ

рд╕рд╛рдБрдЪрд╛ < рдЯрд╛рдЗрдкрдирд╛рдо рдПрдлрдЯреА>

рд╕рдВрд░рдЪрдирд╛ рдлрд╝рдВрдХреНрдЯрд░: рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝рдВрдХреНрд╢рдирд▓рдЗрдордкреНрд▓реЗрдЯ <FT>

{

рдлрд╝рдВрдХреНрдЯрд░ (): рдлрд╝рдирдПрдХреНрдЯрд░рдЗрдореНрдкреНрд▓ <FT> ( NULL ) {;}

рдлрд╝рдВрдХреНрдЯрд░ (рдПрдлрдЯреА fn): рдлрд╝рдирдПрдХреНрдЯрд░рдЗрдореНрдкреНрд▓ <FT> (fn) {;};

};



int plus_fn ( int a, int b) { рд░рд┐рдЯрд░реНрди рдП + рдмреА ;;

int minus_fn ( int a, int b) { рд╡рд╛рдкрд╕реА a - b;}

int increment ( рдЗрдВрдЯ & рдП) { рд░рд┐рдЯрд░реНрди рдП ++ ;;



int main ()

{

рдлрд╝рдВрдХреНрдЯрд░ < int ( int , int )> рдкреНрд▓рд╕ (plus_fn);

рдлрд╝рдирдХрд╛рд░ < int ( рдЗрдВрдЯ , рдЗрдВрдЯ )> рдорд╛рдЗрдирд╕ (рдорд╛рдЗрдирд╕_рдлрд╝реНрди);

рдлрд╝рдВрдХреНрдЯрд░ < int ( рдЗрдВрдЯ &)> рдЗрдВрдХ (рд╡реЗрддрди рд╡реГрджреНрдзрд┐);



std :: cout << plus ( 10 , 20 ) << "" << рдорд╛рдЗрдирд╕ ( 10 , 20 ) << std :: endl ;



int a = 100 ;

std :: cout << inc (a) << "" ;

std :: cout << a << std :: endl ;

}



рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ:



30 -10

100 101



рдФрд░ рдХреЛрдб рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реИред рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ :: рдлрд╝рдВрдХреНрд╢рдиред

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИрдВ:

// рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рдХреЛ рд╕рдореЗрдЯрддреЗ рд╣реБрдП рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрдВрдЯреЗрдирд░ рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо рдЯреА, рдЯрд╛рдЗрдкрдиреЗрдо рдЖрд░, рдЯрд╛рдЗрдкрдиреЗрдо ... рдЖрд░реНрдЧреНрд╕>

рд╕рдВрд░рдЪрдирд╛ рдлрдВрдХреНрд╢рдирд▓рдЗрдореНрдкреНрд▓ <R (T :: *) (рдЖрд░реНрдЧреНрд╕ ...)>

{

рдЯрд╛рдЗрдкрдбрд┐рдл рдЖрд░ (рдЯреА :: * рдПрдлрдЯреА) (рдЖрд░реНрдЧреНрд╕ ...);

рдЯрд╛рдЗрдкрдбрд┐рдл рдЯреА рд╣реЛрд╕реНрдЯ рдЯрд╛рдЗрдк;



FunctorImpl (FT fn = NULL , T * obj = NULL ): m_fn (fn), m_obj (obj) {;};



// рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░ рдХреЗ рджреЛ рд╡реЗрд░рд┐рдПрдВрдЯ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрдм рдлрд╝рдВрдХреНрдЯрд░ рдХреЛ "рдмрдВрдж" рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ,

// рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛

рдЖрд░ рдСрдкрд░реЗрдЯрд░ () (Args ... args)

{

(m_obj -> * m_fn) (args ...);

}



рдЖрд░ рдСрдкрд░реЗрдЯрд░ () (рдЯреА * рдУрдмреНрдЬ, рдЖрд░реНрдЧреНрд╕ ... рдЖрд░реНрдЧреНрд╕)

{

(obj -> * m_fn) (args ...);

}



рдПрдлрдЯреА m_fn;

рдЯреА * m_obj;

};





// рдПрдХ рдХреНрд▓реЛрдЬрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рдбрд┐рдХреНрд▓реЗрдпрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореЗрдВрдмрд░ рдлрдВрдХреНрд╢рди рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИред

рд╕рд╛рдБрдЪрд╛ < рдЯрд╛рдЗрдкрдирд╛рдо рдПрдлрдЯреА>

рд╕рдВрд░рдЪрдирд╛ рдмрдВрдж: рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ FunctorImpl <FT>

{

typedef рдЯрд╛рдЗрдкрдиреЗрдо рдлрдирдЯреЗрд░рдЗрдореНрдкреНрд▓ <FT> :: HostType HostType;

рдмрдВрдж (HostType * obj, FT fn): рдлрдирдХрд╛рд░рдЗрдореНрдкреНрд▓ <FT> (fn, obj {};

};



// рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдХрдХреНрд╖рд╛ рдП

{

рдЬрдирддрд╛ :

A ( int base = 0 ): m_base (рдмреЗрд╕) {;}

int foo ( рдЗрдВрдЯ ) a {{a + m_base ;;



рдирд┐рдЬреА :

int m_base

};



рдП рдмреА 1 ( 10 ), рдмреА 2;

рдмрдВрдж рдХрд░рдирд╛ < int (A :: *) ( int )> a_foo (& b1, & A :: foo);

// рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдордЧреНрд░ рдлрд╝рдирдХрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕реЗ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдлрд╝рдирдХрд╛рд░ < int (A :: *) ( int )> b_foo (& A :: foo);



std :: cout << a_foo ( 20 ) << "" << b_foo (& b2, 20 ) << "" << b_foo (& b1, 20 ) << std :: endl ;



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

1. рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо ... рдЖрд░реНрдЧреНрд╕> рд╕рдВрд░рдЪрдирд╛ рдлрдВрдХреНрд╢рдирд▓рдЗрдореНрдкреНрд▓;



2. рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдЖрдВрд╢рд┐рдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдХреЗ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо R, рдЯрд╛рдЗрдкрдиреЗрдо ... Args>

рд╕рдВрд░рдЪрдирд╛ рдлрдВрдХреНрд╢рдирд▓рдЗрдореНрдкреНрд▓ <R (Args ...)>



3. рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬрдм рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣, рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ, рдЕрдиреБрдореЗрдп рд╣реИред

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



рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЗ



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

// рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ рдЬреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рд▓реЗрддрд╛ рд╣реИ

рдЯреЗрдореНрдкрд▓реЗрдЯ < int ... рдирдореНрд╕>

рд╕рдВрд░рдЪрдирд╛ рд╕реБрдиреНрди

{

// рдПрдХ рд╕реНрдерд┐рд░ рд╕рд░рдгреА рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рд░рд┐рдд рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ

рд╕реНрдерд┐рд░ int m_nums [ sizeof ... (Nums)];

// рдФрд░ рдпрд╣ рднреА рдПрдХ рдШреЛрд╖рдгрд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ

enum {nums_count = sizeof ... (рдирдореНрд╕)};

};



// рд╕реНрдЯреЗрдЯрд┐рдХ рдРрд░реЗ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ

рдЯреЗрдореНрдкрд▓реЗрдЯ < int ... рдирдореНрд╕>

int NumsPack <Nums ...> :: m_nums [] = {Nums ...};

рд╕рддреНрдпрд╛рдкрди рдХреЛрдб:

typedef NumsPack < 10 , 20 , 30 , 40 , 50 > Nums_5;

std :: cout << Nums_5 :: nums_count << std :: endl ;

for ( int n = 0 ; n <nums_5 :: nums_count; ++ n)

std :: cout << Nums_5 :: m_nums [n] << "" ;

std :: cout << std :: endl ;



рдХрдВрд╕реЛрд▓ рдХреЛ рдкреНрд░рд┐рдВрдЯ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ

5

резреж реиреж рейреж рекреж релреж



рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЖрдХрд╛рд░ рдХрд╛ рдЖрдХрд╛рд░ (рдирдореНрд╕) рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреИрдХреЗрдЬ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ, Nums рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдХрд╛ рдирд╛рдо рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдбрд┐рдЬрд╛рдЗрди рдРрд╕рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреИрдХреЗрдЬ (рдЗрд╕рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рдХрдЯреАрдХрд░рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛) рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╛ рдирдП рдорд╛рдирдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред



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

рдЯреЗрдореНрдкрд▓реЗрдЯ < int ... рдирдореНрд╕>

int NumsPack <Nums ...> :: m_nums [] = {Nums * 10 ...};



рдЬрд┐рд╕рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрдХреНрд░рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛:

100 200 300 400 500



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



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

рдбрдмрд▓ fn1 ( рдбрдмрд▓ рдП)

{

рд╡рд╛рдкрд╕реА рдПрдХ * 2 ;

}



int fn2 ( рдЗрдВрдЯ )

{

рд╡рд╛рдкрд╕реА рдПрдХ * 3 ;

}



int fn3 ( int )

{

рд╡рд╛рдкрд╕реА рдПрдХ * 4 ;

}



рдФрд░ рджреЛ рдСрдкрд░реЗрд╢рди:

int test_opr ( рдЗрдВрдЯ рдП, рдЗрдВрдЯ рдмреА)

{

рд╡рд╛рдкрд╕реА рдПрдХ + рдмреА;

}



int test_opr3 ( рдЗрдВрдЯ рдП, рдЗрдВрдЯ рдмреА, рдЗрдВрдЯ рд╕реА)

{

рд╡рд╛рдкрд╕реА рдПрдХ + рдмреА * рд╕реА;

}



рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдлрд╝рдирдХрд╛рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЬрд┐рд╕рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛрдЧрд╛:

test_opr(f1(x), f2(x));





рдпрд╛

test_opr3(f1(x), f2(x), f3(x));







рдлрд╝рдирдХрд╛рд░ рдХреЛ рдПрдХ рдСрдкрд░реЗрд╢рди рдФрд░ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдлрдиреНрдиреЗрдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо рдУрдк, рдЯрд╛рдЗрдкрдиреЗрдо ... рдПрдл>

рдХреНрд▓рд╛рд╕ рдХрдВрдкреЛрдЬрд┐рдЯрд░

{

рдЬрдирддрд╛ :

рд░рдЪрдирд╛рдХрд╛рд░ (рд╕реЗрд╢рди op, F ... fs);

};



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

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо рдЯреА>

рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдбреЗрдЯрд╛рд╣рд╛рд░реНрдб

{

рдЯреА m_data;

};



рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо рдУрдк, рдЯрд╛рдЗрдкрдиреЗрдо ... рдПрдл>

рд╢реНрд░реЗрдгреА рд╕рдВрдЧреАрддрдХрд╛рд░: рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЗрдЯрд╛ рдлрд╝реЛрд▓реНрдбрд░ <F> ...

{

// ...

};



рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ - рдпрджрд┐ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рд╣реА рд╡рд░реНрдЧ рдореМрдЬреВрдж рд╣реЛрдЧрд╛ред рдЗрд╕ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреИрдХреЗрдЬ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ "рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдЯрдкрд▓" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдПрди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ 0 рд╕реЗ рдПрдХ рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реИрдВ:

// рдЯрдкрд▓ рдХреА рдХрдХреНрд╖рд╛ рдХреЛ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

рдЯреЗрдореНрдкрд▓реЗрдЯ < int ... Idxs> рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЗрдВрдбреЗрдХреНрд╕рдЯреБрдкрд▓

{

};



// рдЯрдкрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

рдЯреЗрдореНрдкрд▓реЗрдЯ < int Num, typename Tp = IndexesTuple <>>

рд╕рдВрд░рдЪрдирд╛ IndexTupleBuilder;



// рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рдкреИрдХреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

// рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЯрдкрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдШреЛрд╖рдгрд╛ рдореЗрдВ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рдЙрддреНрдкрдиреНрди рдПрдХ

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

рдЯреЗрдореНрдкрд▓реЗрдЯ < int Num, int ... Idxs>

рд╕рдВрд░рдЪрдирд╛ IndexTupleBuilder <Num, IndexesTuple <Idxs ... >>: IndexTupleBuilder <Num - 1 , IndexesTuple <Idxs ..., sizeof ... (Idxs) >>

{

};



// рдкреБрдирд░рд╛рд╡рд░реНрддрди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рд╕рдорд╛рдкреНрддрд┐ред рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреНрдпреВрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рдгрд╛рдореА рдЯрд╛рдЗрдкрдлреЗрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ

рдЯреЗрдореНрдкрд▓реЗрдЯ < int ... Idxs>

рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЗрдВрдбреЗрдХреНрд╕рдЯреБрдкрд▓реЗрдмрд▓ < 0 , рдЗрдВрдбреЗрдХреНрд╕рд╕рдЯреБрдкрд▓ <рдЖрдИрдбреАрдПрдХреНрд╕ ... >>

{

typedef IndexesTuple <Idxs ...> рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛;

};



рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдк рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

typedef typename IndexTupleBuilder < 6 > рдЕрдиреБрдХреНрд░рдорд┐рдд;

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, IndexesTuple <0, 1, 2, 3, 4, 5> рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдВрдЧреЗ



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

рдЯреЗрдореНрдкрд▓реЗрдЯ < int idx, рдЯрд╛рдЗрдкрдиреИрдо рдЯреА>

рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдбреЗрдЯрд╛рд╣рд╛рд░реНрдб

{

DataHolder (рдЯреА рдХрд╛рд╕реНрдЯ рдФрд░ рдбреЗрдЯрд╛): m_data (рдбреЗрдЯрд╛) {;}



рдЯреА m_data;

};



// рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрдкрд▓ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЗрд╕ рд░реВрдк рдореЗрдВ рд╕реАрдзреЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди

// рдпрд╣ рдмрд╛рдж рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдирд╛рдореЗ IdxsTuple, typename ... F> рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╕рдВрдЧреАрддрдХрд╛рд░;



// рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВ, рдПрдХ рдЯреНрдпреВрдкрд▓ рд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреИрдХреЗрдЬ рдХреЛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред

// рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рджреЛ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

// рдкреВрд░реНрдгрд╛рдВрдХ рдЯрдкрд▓ рдХреЗ рддрддреНрд╡ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреАред

рдЯреЗрдореНрдкрд▓реЗрдЯ < int ... Idxs, рдЯрд╛рдЗрдкрдиреЗрдо ... F>

рд╕рдВрд░рдЪрдирд╛ рд╕рдВрдЧреАрддрдХрд╛рд░ <IndexesTuple <Idxs ...>, F ...>: рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ DataHolder <Idxs, F> ...

{

// рдФрд░ рдпрд╣рд╛рдВ рдкреИрдЯрд░реНрди рдореЗрдВ рдПрдХ рд╕рд╛рде рддреАрди рдкреИрдХреЗрдЬ рд╣реИрдВ - рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдХреЗрдЬ, рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдкреИрдХреЗрдЬ рдФрд░ рддрд░реНрдХреЛрдВ рдХрд╛ рдПрдХ рдкреИрдХреЗрдЬред рдпрд╣ рд╕рдм рд╕реВрдЪреА рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИред

// рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЖрд░рдВрднреАрдХрд░рдгред

рдХрдореНрдкреЛрдЬрд╝рд░рдмреЗрд╕ (рдПрдл ... рдПрдлрдПрд╕): рдбреЗрдЯрд╛рд╣рд╛рд░реНрдб <рдЗрдбрд┐рдХреНрд╕, рдПрдл> (рдПрдлрдПрд╕) ...}};

};



// рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВ

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо рдУрдк, рдЯрд╛рдЗрдкрдиреЗрдо ... рдПрдл>

рд╕рдВрд░рдЪрдирд╛ рд╕рдВрдЧреАрддрдХрд╛рд░: рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрдЧреАрддрдХрд╛рд░ < рдЯрд╛рдЗрдкрдиреЗрдо рд╕реВрдЪрдХрд╛рдВрдХ рдЯрд╛рдЗрдкрд▓реЗрдмрд▓ < рдЖрдХрд╛рд░ ... (рдПрдл)> :: рд╕реВрдЪрдХрд╛рдВрдХ, рдПрдл ...>

{

рдСрдк m_op;

рдЬрдирддрд╛ :

// рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ

рд╕рдВрдЧреАрддрдХрд╛рд░ (op op, F const & ... fs): m_op (op), рдмреЗрд╕ (fs ...) {};

};



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

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо рдУрдк, рдЯрд╛рдЗрдкрдиреЗрдо ... рдПрдл>

рд╕рдВрд░рдЪрдирд╛ рд╕рдВрдЧреАрддрдХрд╛рд░: / * ... * /

{

рдСрдк m_op;

рдЬрдирддрд╛ :

typedef рдШреЛрд╖рдгрд╛рдкрддреНрд░ (m_op ((* (F *) NULL ) ( 0 ) ...) result_t;

// ...

};



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

рдШреЛрд╖рдгрд╛рдкрддреНрд░ (op (fs (0) ...))

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



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

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо рдУрдк, рдЯрд╛рдЗрдкрдиреЗрдо ... рдПрдл>

рд╕рдВрд░рдЪрдирд╛ рд╕рдВрдЧреАрддрдХрд╛рд░: / * ... * /

{

рдСрдк m_op;

рдЬрдирддрд╛ :

ret_type рдСрдкрд░реЗрдЯрд░ () ( int x) const

{

MakeCall (x, рдЕрдиреБрдХреНрд░рдорд┐рдд ());

}

рдирд┐рдЬреА :

// рдпрд╣ рдЙрд╕реА рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХреЙрдореНрдкреЛрдЬрд╝рд░рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВред рдЯрдкрд▓ рдХрд╛ рдкреНрд░рдХрд╛рд░ "рдкрдХрдбрд╝рдиреЗ" рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

// рдкреВрд░реНрдгрд╛рдВрдХ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХрд╛ рдкреИрдХреЗрдЬ

рдЯреЗрдореНрдкрд▓реЗрдЯ < int ... Idxs>

ret_type MakeCall ( int x, IndexesTuple <Idxs ...> const &) const

{

рд╡рд╛рдкрд╕реА m_op (DataHolder <Idxs, F> :: m_data (x) ...);

}

};

рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ:

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо рдУрдк, рдЯрд╛рдЗрдкрдиреЗрдо ... рдПрдл>

рд╕рдВрдЧреАрддрдХрд╛рд░ <Op, F ...> рд░рдЪрдирд╛ (Op рд╕реЗрд╢рди, F ... fs)

{

рд╡рд╛рдкрд╕реА рд╕рдВрдЧреАрддрдХрд╛рд░ <Op, F ...> (op, fs ...);

}



рдФрд░ рд╕рдВрдЧреАрддрдХрд╛рд░ рддреИрдпрд╛рд░ рд╣реИред рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:

рдСрдЯреЛ f = рдореЗрдХрдУрдк (test_opr, fn1, fn2);

рдСрдЯреЛ ff = MakeOp (test_opr3, fn1, fn2, fn3);

рдСрдЯреЛ ff1 = рдореЗрдХрдУрдк (test_opr3, fn1, fn2, [=] ( int x) { рд╡рд╛рдкрд╕реА f (x) * 5 ;}}; // рдпрд╣рд╛рдВ рдХрдВрдкреЛрдЬрд░ рдХрд╛ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рд▓рдВрдмреЛ рдлрдВрдХреНрд╢рди рд╣реИред



рд╕рдВрдЧреАрддрдХрд╛рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдХреА рдкреВрд░реА рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

рдЯреЗрдореНрдкрд▓реЗрдЯ < int ... Idxs, рдЯрд╛рдЗрдкрдиреЗрдо ... F>

рд╕рдВрд░рдЪрдирд╛ рд╕рдВрдЧреАрддрдХрд╛рд░ <IndexesTuple <Idxs ...>, F ...>: рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ DataHolder <Idxs, F> ...

{

рдХрдореНрдкреЛрдЬрд╝рд░рдмреЗрд╕ (рдПрдл ... рдПрдлрдПрд╕): рдбреЗрдЯрд╛рд╣рд╛рд░реНрдб <рдЗрдбрд┐рдХреНрд╕, рдПрдл> (рдПрдлрдПрд╕) ...}};

};





рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо рдУрдк, рдЯрд╛рдЗрдкрдиреЗрдо ... рдПрдл>

рд╕рдВрд░рдЪрдирд╛ рд╕рдВрдЧреАрддрдХрд╛рд░: рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрдЧреАрддрдХрд╛рд░ < рдЯрд╛рдЗрдкрдиреЗрдо рд╕реВрдЪрдХрд╛рдВрдХ рдЯрд╛рдЗрдкрд▓реЗрдмрд▓ < рдЖрдХрд╛рд░ ... (рдПрдл)> :: рд╕реВрдЪрдХрд╛рдВрдХ, рдПрдл ...>

{

рдСрдк m_op;

рдЬрдирддрд╛ :

typedef ComposerBase < typename IndexTupleBuilder < sizeof ... (F)> :: рдЕрдиреБрдХреНрд░рдорд┐рдд, F ...> рдЖрдзрд╛рд░;

typedef рдШреЛрд╖рдгрд╛рдкрддреНрд░ (m_op ((* (F *) NULL ) ( 0 ) ...) result_t;



рд╕рдВрдЧреАрддрдХрд╛рд░ (op op, F const & ... fs): m_op (op), рдмреЗрд╕ (fs ...) {};



result_t рдСрдкрд░реЗрдЯрд░ () ( int x) рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓

{

MakeCall (x, рдЯрд╛рдЗрдкрдирд╛рдореЗрдХреНрд╕ IndexTupleBuilder < sizeof ... (F)> :: рдЕрдиреБрдХреНрд░рдорд┐рдд ());

}

рдирд┐рдЬреА :



рдЯреЗрдореНрдкрд▓реЗрдЯ < int ... Idxs>

result_t MakeCall ( int x, IndexesTuple <Idxs ...> const &) const

{

рд╡рд╛рдкрд╕реА m_op (DataHolder <Idxs, F> :: m_data (x) ...);

}

};



рд╕рд╛рде рд╣реА рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ STL (std :: tuple) рд╕реЗ рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, DataHolder рд╡рд░реНрдЧ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдЧрд╛:

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо рдУрдк, рдЯрд╛рдЗрдкрдиреЗрдо ... рдПрдл>

рд╡рд░реНрдЧ TupleComposer

{

рдСрдк m_op;

std :: tuple <F ...> m_fs;

рдЬрдирддрд╛ :

typedef рдШреЛрд╖рдгрд╛рдкрддреНрд░ (m_op ((* (F *) NULL ) ( 0 ) ...) result_t;



TupleComposer (Op op, F ... fs): m_op (op), m_fs (f ... ... {}};



result_t рдСрдкрд░реЗрдЯрд░ () ( int x) рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓

{

MakeCall (x, рдЯрд╛рдЗрдкрдирд╛рдореЗрдХреНрд╕ IndexTupleBuilder < sizeof ... (F)> :: рдЕрдиреБрдХреНрд░рдорд┐рдд ());

}

рдирд┐рдЬреА :



рдЯреЗрдореНрдкрд▓реЗрдЯ < int ... Idxs>

result_t MakeCall ( int x, IndexesTuple <Idxs ...> const &) const

{

рд╡рд╛рдкрд╕реА m_op ( std :: get <Idxs> (m_fs)

(x) ...);

}

};



рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИред



рдХреБрдЫ рдФрд░ рдЯреЛрдЯрдХреЗ



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

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо ... рдЯреА>

рд╢реВрдиреНрдп рдЙрдкреЗрдХреНрд╖рд╛ (T ...) {;;



рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо ... рдЯреА>

int рдХреИрд▓реНрдХрд╕рдо (рдЯреА ... рдЕрдВрдХ)

{

int ret_val = 0 ;

рдЙрдкреЗрдХреНрд╖рд╛ (ret_val + = nums ...);

рд╡рд╛рдкрд╕реА ret_val;

}



рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдЪрд░рд┐рдд рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реИрдВ:

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо ... рдЯреА>

рдмреВрд▓ рд╣рд╕рдкреЛрдЬрд┐рдЯрд┐рд╡реНрд╕ (рдЯреА ... рдЕрдВрдХ)

{

рдмреВрд▓ ret_val = true ;

рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ (ret_val = ret_val && nums> = 0 ...);

рд╡рд╛рдкрд╕реА ret_val;

}



рд▓реЗрдХрд┐рди рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рддрд░реНрдХ рдХреА рдЧрдгрдирд╛ рдХрд╛ рдХреНрд░рдо, рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рдирд╛, рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╣ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



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

рдСрдЯреЛ рдкрд░рд┐рдгрд╛рдо = рдЖрд░реНрдЧ + ...;

рдкреИрдХреЗрдЬ рддрддреНрд╡реЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред




All Articles