рдЬреЛ рд▓реЛрдЧ рдЖрдВрджреНрд░реЗрдИ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ "рдореЙрдбрд░реНрди рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рдХреА рдХрд┐рддрд╛рдм рдкрдврд╝рддреЗ рд╣реИрдВ, рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╢реНрд░реЗрдгреА рд╣реИ (рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ), рдЬрдм рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдЪрд░ (рдкреВрд░реНрд╡ рдЕрдЬреНрдЮрд╛рдд) рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг:
- рдЯреБрдкрд▓реНрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг
- рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддрд░рд╣ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг
- рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рддрд░реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ)
- рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реЗрдЯреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд░реНрдЧреАрдХрд░рдг
- рдЖрджрд┐ред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдореЗрдВ, рддрд░реНрдХреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдФрд░, рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓рдирд╛, рдпрд╣ рдЙрд╕реА рдХреА рдЗрдЪреНрдЫрд╛ рдФрд░ рдЬрд░реВрд░рддреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддрд╛ рд╣реИред
рд╡рд░реНрддрдорд╛рди рд╕реА ++ рдорд╛рдирдХ рдХреЗ рддрд╣рдд, рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХреЛрдИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдВрдЦреНрдпрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдирд╣реАрдВред рдПред рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ (рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХ рдореЗрдВ) рддрдерд╛рдХрдерд┐рдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред "рдЯрд╛рдЗрдк рд╕реВрдЪреА", рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреИрдЯрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдПрдХ рдПрдХрд▓ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдореЗрдВ :: рд╡реИрд░рд┐рдПрдВрдЯ рдФрд░ рдмреВрд╕реНрдЯ :: рдЯрдкрд▓) рдХреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ (рд╕рднреА рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ) рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп рд╣реИрдВред рдпреЗ рджреЛрдиреЛрдВ рд╕рдорд╛рдзрд╛рди рдЖрдзреЗ-рдЕрдзреВрд░реЗ рд╣реИрдВ рдФрд░ рд╕рдВрднрд╡ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдХрдорд┐рдпреЛрдВ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдФрд░ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдирдпрд╛ рдорд╛рдирдХ C ++ - рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдирдпрд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ? "рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ" рдпрд╛, рдореВрд▓ рдореЗрдВ, "рд╡реИрд░реЗрдбрд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯ"ред
рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ
рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдШреЛрд╖рдгрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
рдЯреЗрдореНрдкрд▓реЗрдЯ <
рдЯрд╛рдЗрдкрдиреЗрдо ... рдкреНрд░рдХрд╛рд░>
рд╡рд░реНрдЧ VariadicTemplate
{
};
рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
рдЯреЗрдореНрдкрд▓реЗрдЯ <
int ... рд╕реНрдпрд╛рд╣реА>
рд╡рд░реНрдЧ VariadicTemplate
{
};
рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд░реНрддрдорд╛рди рдорд╛рдирдХ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИ (рдпрджрд┐ рдпрд╣ рдХрд╣рдирд╛ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ)ред
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЖрдк рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рднреА рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдорд╛рди рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
рдЯреЗрдореНрдкрд▓реЗрдЯ <
рдЯрд╛рдЗрдкрдирд╛рдо ... рдЯрд╛рдЗрдк>
рд╢реВрдиреНрдп рдкреНрд░рд┐рдВрдЯрдлрд╝ (
рдХрд╛рд╕реНрдЯ рдЪрд╛рд░ * рдкреНрд░рд╛рд░реВрдк, рдкреНрд░рдХрд╛рд░ ... рдЖрд░реНрдЧреНрд╕);
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ (рдЙрдиреНрд╣реЗрдВ "рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХ" рдпрд╛ "рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдЬрд╣рд╛рдВ рднреА рдирд┐рдпрдорд┐рдд (рдПрдХрд▓) рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдЯреЗрдореНрдкрд▓реЗрдЯ (рдмреЗрд╕-рд╕реНрдкреЗрд╕рд┐рдпрд░-рд▓рд┐рд╕реНрдЯ) рдХреЗ рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдореЗрдВ;
- рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдореЗрдорд░реНрд╕-рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░-рд▓рд┐рд╕реНрдЯ) рдореЗрдВ рдбреЗрдЯрд╛ рд╕рджрд╕реНрдпреЛрдВ рдХреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реВрдЪреА рдореЗрдВ;
- рдЖрд░рдВрднреАрдХрд░рдг рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ (initializer-list)
- рдЕрдиреНрдп рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ (рдЯреЗрдореНрдкрд▓реЗрдЯ-рддрд░реНрдХ-рд╕реВрдЪреА);
- рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ (рдбрд╛рдпрдиреЗрдорд┐рдХ-рдЕрдкрд╡рд╛рдж-рд╡рд┐рдирд┐рд░реНрджреЗрд╢);
- рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реВрдЪреА (рд╡рд┐рд╢реЗрд╖рддрд╛-рд╕реВрдЪреА) рдореЗрдВ;
- рдПрдХ рд▓рдВрдмреЛ рдлрд╝рдВрдХреНрд╢рди (рдХреИрдкреНрдЪрд░-рд╕реВрдЪреА) рдХреА рдХреИрдкреНрдЪрд░ рд╕реВрдЪреА рдореЗрдВред
рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдХрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕реНрд╡рдпрдВ "рдкреИрдХреЗрдЬ рд╡рд┐рд╕реНрддрд╛рд░" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:
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 ++ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рд╡реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореМрдЬреВрдж (рдпрд╛ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЕрдиреНрдп рдЕрдиреБрдХрд░рдг) рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╕реНрдкрд╖реНрдЯ рдХрдорд┐рдпреЛрдВ рд╕реЗ рд░рд╣рд┐рдд рд╣реИрдВ, рд╡реЗ рдХреЛрдб рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рдорд╛рддреНрд░рд╛ рдХреА рдЬрдЧрд╣ рдЬрдЯрд┐рд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рд╡рд░реНрддрдорд╛рди рдорд╛рдирдХ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдХрд┐рдП рдЧрдП рд╕рдорд╛рди рдирд┐рд░реНрдорд╛рдгреЛрдВ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдк рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ :: рдмрд╛рдБрдз, рдмрдврд╝рд╛рд╡рд╛ :: рдХрд╛рд░реНрдп, рдмрдврд╝рд╛рд╡рд╛ :: рдЯрдкрд▓)ред рд▓реЗрдХрд┐рди рд╡реЗ рдХреБрдЫ рдХрдорд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реИрдВред рдореБрдЦреНрдп рдПрдХ рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдВрджрд░реНрдн рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд▓реИрдВрдмрдбрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдЕрдВрджрд░ рдкреИрдХреЗрдЬ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕реА рдЕрдиреБрд░реЛрдз рдХреЛ рдорд╛рдирдХреАрдХрд░рдг рд╕рдорд┐рддрд┐ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдЕрдиреБрд░реЛрдз рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдЧрд╛?), рдкреИрдХреЗрдЬ рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдирд╣реАрдВ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ:
рдСрдЯреЛ рдкрд░рд┐рдгрд╛рдо = рдЖрд░реНрдЧ + ...;
рдкреИрдХреЗрдЬ рддрддреНрд╡реЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред