рдЕрдЪреНрдЫрд╛ рджрд┐рди, рдкреНрд░рд┐рдп рд╣реЗрдмреНрд░реЛрд╕реЛрд╕рд┐рдЯреАред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рдХрд░реА рдФрд░ рдЖрдВрд╢рд┐рдХ рдЖрд╡реЗрджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЗрд╕ рд╡рд┐рд╡рд╛рдж рдХрд╛ рд╕рд╛рд░ рдпрд╣ рдерд╛ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ: рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреЗрдореЗрд░реНрд▓реЗ рдореЗрдВ) рдпрд╛ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдХрд░реА (рдЬреИрд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ )ред
Nemerle: def sum3(x: int, y: int, z: int): int // { x + y + z; }; def sum3y = sum3(_, 5, _); // def sum3yz = sum3y(_, 5); // def sum3yzx = sum3yz(5); // тАж , 15
Haskell: sum3 xyz = x + y + z
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдкрд╣рд▓реЗ рд╣реА рдЙрд╕ рд╕рдордп рд╕реЗ рдЧреБрдЬрд░ рдЪреБрдХрд╛ рд╣реИ рдЬрдм рдЕрд╡рд╕рд░ рдЖрдЧрд╛рдореА рд╕реА ++ рдорд╛рдирдХ, рдЕрд░реНрдерд╛рддреН рд╡реИрд░рд╛рдбрд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рд╕реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдПред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ, рд▓реЗрдЦ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рдХреЗ рд▓рд┐рдП рдХрд░реА рдФрд░ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, MinGW gcc 4.6.1 рдФрд░ рдХреЛрдб :: рдмреНрд▓реЙрдХ 10.05 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
currying
рдЪрд▓рд┐рдП рдХрд░реАрдиреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдпрд╣ рд╕рд╣рдЬ рд╣реИред рд▓рдХреНрд╖реНрдп рдПрдХ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХрд░реА рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╢реЗрд╖ рддрд░реНрдХреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
std::function< int(int, int, int) > f = [] ( int x, int y, int z ) { return x + y + z; }; auto f1 = carry(f); auto f2 = f1(5, 5); auto v15 = f2(5);
рд╣рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд▓рдХреНрд╖реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛, рдЬреЛ рдПрдХ рдЕрдкрд░рд┐рдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдкрд░ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ-рдлрд╝рдВрдХреНрд╢рди рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдирддреАрдЬрд╛ рдПрдХ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЕрднреА рднреА рдкрд╛рд░рд┐рдд рддрд░реНрдХреЛрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ C ++ рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рд╣реИ рд╡рд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдХреЙрдкреА рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдкрддреЗ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХреЛрдИ рднреА рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рджрд╛рд░реНрд╢рдирд┐рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐, рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬреЗрдВред рдЖрдк рднрд╡рд┐рд╖реНрдп рдореЗрдВ рднреА, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд╛рдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рд╢рд╛рдпрдж рд▓рд┐рдВрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддреН рд╢реЗрд╖ рд╡реНрдпрдХреНрддрд┐ред рддреЛ, рд╣рдореЗрдВ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЖрдЧреЗ, рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рддрд░реНрдХреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢реЗрд╖ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рджреЛ рд╕реЗрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ: рдкрд╛рд░рд┐рдд рдФрд░ рд╢реЗрд╖ред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрд╡рд░рдг рдПрд╕рдкреАрдбреА :: рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рдФрд░ рддрд░реНрдХ рдПрд╕рдЯреАрдбреА :: рдЯреНрдпреВрдкрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЧрдП рдереЗред рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рд╣рд╛рдпрдХ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдирд╛рдо рдЙрдирдХреЗ рд╕рд╛рд░ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЦреБрдж рдПрдХ рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рджрд╛рд╡рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рдЙрдирдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдиреАрдЪреЗ рдХреНрд▓рд╛рд╕ рдХреЛрдб рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдХреНрд▓рд╛рд╕ рдХреЛрдб рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрдкреНрд░рдорд╛рдгрд┐рдд рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП
рдкреИрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдкреНрд░рдЪреБрд░ рдЙрдкрдпреЛрдЧ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
template< class, class, class > class CarryHolder; template< class OUT_TYPE, class... IN_TYPES, uint32_t... CAP_INDEXES, uint32_t... RES_INDEXES > class CarryHolder< std::function< OUT_TYPE ( IN_TYPES... ) >, UintContainer< CAP_INDEXES... >, // UintContainer< RES_INDEXES... > > // { public: typedef std::function< OUT_TYPE ( IN_TYPES... ) > FuncType;
рддрд░реНрдХ рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА
рдЖрдВрд╢рд┐рдХ рдЖрд╡реЗрджрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЖрдЧреЗ рдХрд░реНрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
std::function< int(int, int, int) > f = [] ( int x, int y, int z ) { return x + y + z; }; auto f1 = permute<2, 1, 0>(f);
рд╣рдореЗрдВ, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ, рдпрд╛ рдмрд▓реНрдХрд┐, рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рддрд░реНрдХред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ - рддрд░реНрдХреЛрдВ рдХрд╛ рдХреНрд░рдордЪрдпред рд╕рд╛рде рд╣реА, рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди (рдиреАрдЪреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг) рдХреЗ рдкреВрд░рдХ рдФрд░ рд░рд┐рд╡рд░реНрд╕ рдХреНрд░рдордЪрдп (рдЙрд▓рдЯрд╛ рд╕реВрдЪрдХрд╛рдВрдХ) рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рдХреНрд░рдорд╛рдВрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рд╡рд░реНрд╕ рдкрд░рдореНрдпреВрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╡реНрдпреБрддреНрдХреНрд░рдо рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреАрдЪреЗ рдХреНрд▓рд╛рд╕ рдХреЛрдб рд╣реИ рдЬреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
template< class, class > class Permutation; template< class OUT_TYPE, class... IN_TYPES, uint32_t... INDEXES > class Permutation< std::function< OUT_TYPE (IN_TYPES...) >, // UintContainer< INDEXES... > > // { public: typedef std::function< OUT_TYPE (IN_TYPES...) > FuncType; typedef std::function< OUT_TYPE (typename GetNthType< INDEXES, TypeContainer<IN_TYPES...> >::Result...) > NewFuncType; Permutation( Permutation const& perm ): _function( perm._function ) { }; Permutation( FuncType const& f ): _function( f ) { }; private:
рдЕрдм рдПрдХ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ, рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ, рддреБрдЪреНрдЫ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдиреАрдЪреЗ рдХреЛрдб рд╣реИред
template< uint32_t... INDEXES, class FUNC_TYPE > auto partApply( FUNC_TYPE const& f ) -> decltype(carry(permute<INDEXES...>(f))) { return carry(permute<INDEXES...>(f)); };
рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдкреВрд░рдХ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рд╕рднреА рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
std::function< int(int, int, int) > f = [] ( int x, int y, int z ) { return x + y + z; }; auto f1 = permute<2>(f);
рдпреЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЦреЛрд▓рддреЗ рд╣реИрдВред рдмрд╛рдж рдореЗрдВ, рдЕрдЧрд░ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдореИрдВ рдХреЛрдб рдмрд╛рд╣рд░ рд░рдЦреВрдВрдЧрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд░реАрдХрд░рдг рдХрд╛рдлреА рдХреНрд▓рд╛рд╕рд┐рдХ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ-рдЪрд░рдгреАрдп рдФрд░ "рдЕрдирд┐рд╡рд╛рд░реНрдп" рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдХрд░реАрдиреЗ рд╕реЗ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЗ рдЕрд░реНрде рдореЗрдВ) рдлрд╝рдВрдХреНрд╢рди, рд╣рдореЗрдВ рдЕрднреА рднреА рдПрдХ
рдлрд╝рдВрдХреНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдХрдИ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧреИрд░-рд╢рд╛рд╕реНрддреНрд░реАрдп рд╕рд╛рд░ рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдХреЗ рд╣реЗрд░рдлреЗрд░ рдХреЗ рджреМрд░рд╛рди рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рд▓реЗрдХрд┐рди рдпреЗ рд╕рднреА C ++ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред
рдЕрджреНрдпрддрди:рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ CarryHolderSpec рдХреИрд░реА рдореЗрдВ :: рдСрдкрд░реЗрдЯрд░ () рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ std :: function рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрд░реНрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдВрдХ рдЗрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред
рдЕрджреНрдпрддрди:рд╡рд┐рд╖рдп рдХреЛ "рдЕрд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рд╣реЛрдЧрд╛ред