рд╣рдо рдЕрдкрдиреЗ рдПрд╕рдЯреАрдбреА :: рдлрд╝рдВрдХреНрд╢рди (рдмреВрд╕реНрдЯ :: рдлрд╝рдВрдХреНрд╢рди) рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рдПрд╕рдЯреАрдбреА :: рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдмреВрд╕реНрдЯ :: рдлрд╝рдВрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЖрд╡рд░рдг рд╣реИрдВред рдРрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╡рд╕реНрддреБрдПрдВ рдЖрдкрдХреЛ рджрд┐рдП рдЧрдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ, рдЬреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЙрд▓рдмреИрдХ рдХреЙрд▓ рдмрдирд╛рддреЗ рд╕рдордп (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдИ рд╣реИрдВрдбрд▓рд░ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ =)

рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдХреГрдкрдпрд╛


рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп, рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг


рдпрджрд┐ рдЖрдк рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ :: рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдПрд╕рдЯреАрдбреА :: рдлрд╝рдВрдХреНрд╢рди, рддреЛ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЙрдирдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
std :: рдлрд╝рдВрдХреНрд╢рди c ++ 11 рднрд╛рд╖рд╛ рдорд╛рдирдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ gcc-4.7 рдФрд░ msvc-2012 рд╕рдВрдХрд▓рдХ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рднреА рд╕рдорд░реНрдерди рд╣реИ)ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдФрд░ рдорд╛рдирдХ рдПрдХ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рди рд╣реЛрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
int func1() { return 0; } struct callable { int operator() () { return 1; } }; ///... boost::function<int (void)> x; x = func1; int res = x(); //  0    callable c; x = c; res = x(); //  1    


рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╣реА рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрд╡рдпрдВ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

рд╕рд░рд▓рддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЯрд╛рдЗрдк рдЗрд░реЗрдЬрд╝рд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛

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

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВред
рд╣рдо C ++ 11 рдорд╛рдирдХ рд╕реЗ рд╡реИрд░реЗрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, gcc рдкрд╣рд▓реЗ рд╣реА рд╕рдВрд╕реНрдХрд░рдг 4.3 рд╕реЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо рдореВрд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдФрд░ рд╣рдорд╛рд░реЗ рдХреНрд▓рд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╡рд░реНрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реЛрдЧрд╛, рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдЧрд╛ - рдЬрд┐рд╕реЗ рддрдерд╛рдХрдерд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ (рдкреНрд░рдХрд╛рд░) рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИ, рд╕рднреА рдХрд╛рд░реНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЖрдВрд╢рд┐рдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЗрдВ рд╣реЛрдВрдЧреЗред рдЖрдВрд╢рд┐рдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рддрд░реНрдХреЛрдВ рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреБрдж:
 template <typename UnusedType> class function; template <typename ReturnType, typename ... ArgumentTypes> class function <ReturnType (ArgumentTypes ...)> { public: function() : mInvoker() {} template <typename FunctionT> function(FunctionT f) : mInvoker(new free_function_holder<FunctionT>(f)) {} ReturnType operator ()(ArgumentTypes ... args) { return mInvoker->invoke(args ...); } private: class function_holder_base { public: function_holder_base() {} virtual ~function_holder_base() {} virtual ReturnType invoke(ArgumentTypes ... args) = 0; }; typedef std::auto_ptr<function_holder_base> invoker_t; template <typename FunctionT> class free_function_holder : public function_holder_base { public: free_function_holder(FunctionT func) : function_holder_base(), mFunction(func) {} virtual ReturnType invoke(ArgumentTypes ... args) { return mFunction(args ...); } private: FunctionT mFunction; }; invoker_t mInvoker; }; 

рдлрд╝рдВрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ () рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди_рд╣реЛрд▓реНрдбрд░_рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдЗрдирд╡реЛрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╡реЛрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ (рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде) рд╕реЗ рднреА рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдлрдВрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рднреА рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ; рдЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, function_holder_base рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рдВрд╢рдЬ free_function_holder рдмрдирддрд╛ рд╣реИред рдпрд╣ рд╡рдВрд╢ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рд╣реИ - рдпрд╣ рдкрд╛рд░рд┐рдд рддрд░реНрдХ (рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд╛рдЗрдЯрд░ рдпрд╛ рдкреЙрдЗрдВрдЯрд░) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрдирд╡реЛрдХ рд╡рд┐рдзрд┐ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣рд┐рдд рдлрд╝рдирдХрд╛рд░ рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ C ++ рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ std :: function рдФрд░ boost :: function рдХрд╛ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдирд╛рд▓реЙрдЧ рдорд┐рд▓рд╛ рд╣реИ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 int func2(const int * x, int y) { return (*x) + y; } ///... typedef function<int (const int * , int)> int_function_with_two_args_t; int_function_with_two_args_t f2(func2); int x = 10; cout << "calling function with signature int (const int * , int): " << f2(&x, 20) << endl; 

рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:

рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ - рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдФрд░ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░

рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдкреА рдпрд╛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрдзрд╛рд░ рдХреНрд▓рд╛рд╕ рдлрд╝рдВрдХреНрд╢рди_рд╣реЛрд▓реНрдбрд░_рдмреЗрд╕ рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдХреЙрдкреА (рдХреНрд▓реЛрди) рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
  class function_holder_base { public: function_holder_base() {} virtual ~function_holder_base(){} virtual ReturnType invoke(ArgumentTypes ... args) = 0; virtual std::auto_ptr<function_holder_base> clone() = 0; private: function_holder_base(const function_holder_base & ); void operator = (const function_holder_base &); }; 

рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ рдЕрдиреБрдкрдпреЛрдЧреА рдмрдирд╛рддреЗ рд╣реИрдВ (рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдСрдкрд░реЗрдЯрд░ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдирд┐рдЬреА рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ), рдФрд░ рд╣рдо рдХреНрд▓реЛрди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡рд╛рд░рд┐рд╕ рд╕реНрд╡рдпрдВ рд╕рд╣реА рдХреНрд▓реЛрдирд┐рдВрдЧ рд░рдгрдиреАрддрд┐ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдПрдХ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдлрдВрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ:
  function(const function & other) : mInvoker(other.mInvoker->clone()) {} function & operator = (const function & other) { mInvoker = other.mInvoker->clone(); } 

рдпрд╣рд╛рдВ рд╣рдо auto_ptr рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдореЗрдВ рдХреНрд▓реЛрди рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ - free_function_holder:
  typedef free_function_holder<FunctionT> self_type; virtual invoker_t clone() { return invoker_t(new self_type(mFunction)); } 


рдмрд╕ рдЗрддрдирд╛ рд╣реА, рдЕрдм рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдПрдХ рдирд┐рдпрдорд┐рдд рдлрдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИ, рдФрд░ рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 int func1() { return 0; } ///... typedef function<int (void)> int_function_t; int_function_t f1(func1); cout << "calling function with signature int (void): " << f1() << endl; int_function_t f2; f2 = f1; cout << "calling function after assignment operator with signature int (void): " << f2() << endl; int_function_t f3(f2); cout << "calling function after copying ctor with signature int (void): " << f3() << endl; 


рд╣рдо рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ

рд╡рд┐рдзрд┐ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд╛рдлреА рд╕реАрдорд┐рдд рдерд╛: рдореИрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╕реВрдЪрдХ рдХреЗрд╡рд▓ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдореИрдВ рднреА рд╕рдВрджрд░реНрдн (рдХреЙрдиреНрд╕реНрдЯ рдФрд░ рдХреЙрдиреНрд╕реНрдЯ рдирд╣реАрдВ) рдФрд░ рдкреЙрдЗрдВрдЯрд░ (рдХреЙрд╕реНрдЯ рдФрд░ рдХреЙрд╕реНрдЯ рдирд╣реАрдВ) рджреНрд╡рд╛рд░рд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдмреВрд╕реНрдЯ (рдПрд╕рдЯреАрдбреА) рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕ рдкрд░ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрд░рдорд╢рдГ, рддрд░реНрдХ рдЕрдм рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ: рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реА рдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рдлреИрд╕рд▓реЗред рддрджрдиреБрд╕рд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдЦреНрддреА рд╕реЗ 0 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕рдХрд╛ рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
  template <typename FunctionType, typename ClassType, typename ... RestArgumentTypes> class member_function_holder : public function_holder_base { public: typedef FunctionType ClassType::* member_function_signature_t; member_function_holder(member_function_signature_t f) : mFunction(f){} virtual ReturnType invoke(ClassType obj, RestArgumentTypes ... restArgs) { return (obj.*mFunction)(restArgs ...); } virtual invoker_t clone() { return invoker_t(new member_function_holder(mFunction)); } private: member_function_signature_t mFunction; }; 

рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рддреБрдЪреНрдЫ рд╣реИ:
  template <typename FunctionType, typename ClassType> function(FunctionType ClassType::* f) : mInvoker(new member_function_holder<FunctionType, ArgumentTypes ...>(f)) {} 

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

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


рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
 struct Foo { int smth(int x) { return x + 1; } }; ///... typedef function<int (Foo, int)> member_function_t; member_function_t f1 = &Foo::smth; Foo foo; cout << "calling member function with signature int (int): " << f1(foo, 5) << endl; 


рдирд┐рд╖реНрдХрд░реНрд╖


рд╡реИрд░реЗрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕реА рдмреВрд╕реНрдЯ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ (рдЬрд┐рд╕рдореЗрдВ рд╡реИрд░реЗрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдирд╣реАрдВ рд╣реИ) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмреВрд╕реНрдЯрд░.рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдФрд░ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рд╕реАрдорд╛ рд╣реИ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 10, рдЖрдк рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЙрдкрдпреБрдХреНрдд рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ: BOOST_FUNCTION_MAX_ARGS)ред рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдПрдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЛ "рдХреНрд▓реЛрди" рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдПрдХ рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рд╣реИред

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


All Articles