рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рддрд╣рдд
, рдореИрдВ C ++ рдореЗрдВ
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЙрдкрдпреЛрдЧреА рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛
рд╣реВрдВ , рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХреБрдЫ рдкрд╣рд▓реБрдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░
рдХрд░рддрд╛ рд╣реВрдВ ред
рдХрд╛рд░реНрдп рдХреНрдпрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдВ
рдореИрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕
рдХрд░реВрдБрдЧрд╛ :
рдпрд╣ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрд░реНрде рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдПрдХрд▓ рдХреЙрд▓рд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдореБрдлреНрдд рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ ред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЙрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ, рд╣рдо
рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред
рдЙрдиреНрдирдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬреИрд╕реЗ
рдмрдврд╝рд╛рд╡рд╛ , рдЖрд╡рд╢реНрдпрдХ рдХреЙрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рдХреЗ рд╕рдордп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рддрд░реНрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдРрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрд╡рд╕рд░ рдореБрдЦреНрдп рд╡рд┐рд╖рдп рдХреЗ рдврд╛рдВрдЪреЗ рд╕реЗ рдкрд░реЗ рд╣реИрдВ, рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рд╡реЗ рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдХрд░рдг рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧреА рднреА рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдореЗрд░реЗ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд░рд╛рдп рдореЗрдВ, рдХреЛрдб рдХреЗ рдкрдврд╝рдиреЗ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рдЖрд╕рд╛рди рд╣реЛрдиреЗ рджреЗрдВ, рдЬрдмрдХрд┐ рд╕рд╛рдкреЗрдХреНрд╖ рд▓реИрдХреЛрдирд┐рдЬрд╝реНрдо рдФрд░ рд╕рд╛рджрдЧреА рдЬреИрд╕реЗ рдлрд╛рдпрджреЗ рд╣реИрдВред
рдЦреЛрдЬ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛
рддреЛ, рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрдерди: рдХреЙрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдмрд╛рдж рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдореБрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдирд┐рд░реНрдгрдп рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рдХреНрдпрд╛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЦрд╛рдорд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реБрдзрд╛рд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╕рдорд╛рдзрд╛рди рдХрдХреНрд╖рд╛ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрд╡реЗрджрди рдХреА рдЕрдкрдиреА рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХрддрд╛ рдЦреЛ рджреЗрддрд╛ рд╣реИред рдЕрдВрджрд░, рдЖрднрд╛рд╕реА рдХрд╛рд░реНрдпреЛрдВ, рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрд╛рдж рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдЖрд░рдХреНрд╖рдг рдмрдирд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдЧрддрд┐рд╢реАрд▓ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрди рдХреЛ рдореБрдЦреНрдп рдкрд╣рд▓реВ рдорд╛рдирддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрдЪреНрдЪ рдХреЙрд▓ рдлрд╝реНрд░реАрдХреНрд╡реЗрдВрд╕реА рд╡рд╛рд▓реЗ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдХрд┐рд╕реА рдирд┐рд╢реНрдЪрд┐рдд
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЕрдВрджрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд╣реЛрдЧрд╛? .. рдмреЗрд╢рдХ,
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░
рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЖрд╡рд╢реНрдпрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдЖрдХрд╛рд░ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрдлрд░,
рдЬрдЧрд╣ рдореЗрдВ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд╕рд╣реА рд╕рдВрд░реЗрдЦрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИред
рдЦреБрдж рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, C ++ 11 рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб
Xcode 4.5.2 рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2012 рдореЗрдВ C ++ 11 рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрд░ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди
рдирд╡рдВрдмрд░ 2012 рдХрдВрдкрд╛рдЗрд▓рд░ CTP рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп
, рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдорд░реНрдерди рд╕реНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреВрд░реНрдг рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдХреЛрдб рдореЗрдВ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП VS2012 рдХреА рдУрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЗрд╢рд╛рд░рд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реГрджреНрдзрд┐ рдХреА рдХреАрдордд рдкрд░ рд╕рдорд╛рдзрд╛рди рдХреЛ C ++ 03 рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рд▓рд╛рдн рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдореИрдВ рдЕрдВрдд рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ред рдПрдХ рджреВрд░рдЧрд╛рдореА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:
#include <iostream> #include <vector> #include "function.hpp" int foo(int v) { std::cout << "foo: " << v << std::endl; return v; } struct bar { int baz(int v) { std::cout << "bar::baz: " << v << std::endl; return v; } }; int main() {
рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рд░реВрдк рдФрд░ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА
рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг, рдПрдХ рдореИрдХреНрд░реЛ -
BC_BIND рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд▓рдШреБ рдФрд░ рд╕рдорд╛рди рдмрд╛рдзреНрдпрдХрд╛рд░реА рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдПрдХ рдореИрдХреНрд░реЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ, рдПрдХ рдпрд╛ рджреЛ, рд▓реЗрдХрд┐рди рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рддрд░реНрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рдореИрдХреНрд░реЛ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ рдЬрд╛рджреВ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрдзрд┐рднрд╛рд░ рд╕рд┐рдореБрд▓реЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдЖрдЧреЗ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрд╛, рдЕрдЧрд░ рдореИрдВ рдЪрд╛рд╣реВрдВ рддреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рд╡рд┐рдЬреБрдЕрд▓ C ++ рдиреЗ рдорд╛рдирдХ рдХреЗ рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдЬрд╝рди рдХреЛ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕рдиреЗ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрд╛рджреВ рдХрд┐рдпрд╛ред
рдХрд╣рд╛рдиреА рдордЬреЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕реЗ рддрдХ рдЖрддреА рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдЖрд╡рдВрдЯрди рдХреЗ рдмрд┐рдирд╛ рднреА рдХреЛрдИ рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЙрдирдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЖрдо рднрд╛рдЬрдХ рддрдХ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реЗ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдо рд╕реЗ рдХрдо POSIX
рдХреЛ рд╢реВрдиреНрдп * рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХреА
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ , рддреЛ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдлрд┐рд░ рднреА, рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИред рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдХреЛ рдПрдХрд▓ рдХреЙрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЫрджреНрдо рдХреЛрдб рдореЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
function<return_type (...)> function_ptr; return_type free_function(...); class Class { return_type member_function(...); };
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ:
return_type member_function_wrapper(Class *context, ...) { return context->member_function(...); }
рдкрд╣рд▓реЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдПрдХ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐:
return_type free_function_wrapper(void *unused, ...) { return free_function(...); } return_type member_function_wrapper(void *context, ...) { return static_cast<Class*>(context)->member_function(...); }
рдорд╣рд╛рди, рджреЛрдиреЛрдВ рдХрд╛рд░реНрдп,
free_function_wrapper рдФрд░
member_function_wrapper рдХреЗ рдПрдХ рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВред рдпрджрд┐ рдкрд╣рд▓реЗ рдПрдХ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рд╕реВрдЪрдХ рдХреЛ рдЙрд╕рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреИрд╕реЗ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдФрд░ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдЙрди рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рднреА рдореМрдЬреВрдж рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рди рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдХреЗ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рджреНрд╡рд╛рд░рд╛, рдмрд▓реНрдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрддреЗ рджреНрд╡рд╛рд░рд╛ рднреА рдкрд░рд┐рдорд╛рдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕рд░рд▓ рд╕рд╛рд░ рдЙрджрд╛рд╣рд░рдг:
#include <iostream> struct bar { int baz(int v) { std::cout << "bar::baz: " << v << std::endl; return v; } }; template <typename Class, int (Class::*MemberFunctionPtr)(int)> int function_wrapper(void *self, int v) { return (static_cast<Class*>(self)->*MemberFunctionPtr)(v); } int main() { typedef int (*function_ptr)(void*, int); function_ptr f = &function_wrapper<bar, &bar::baz>; bar obj; int const i = f(&obj, 1); std::cout << "result: " << i << std::endl; }
рдЗрд╕ рдкреНрд░рдХрд╛рд░,
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдХреЗрд╡рд▓
NULL ред рдХреЛрдИ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрди, рддреБрдЪреНрдЫ рдХреЙрдкреА рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ - рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдорд╣рд╛рдиред
рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╣реЗрдбрд░ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рд╛рдЗрди рд╕реЗ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ C ++ 11 рд╕реЗ рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ
рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрд┐рдиреНрди рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП C ++ 03 рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
function.hpp #pragma once //#define BC_NO_EXCEPTIONS #include <utility> #include <functional> #define BC_SUBST(Arg) Arg #define BC_BIND_DISAMBIGUATE2(has_args, ...) BC_SUBST(BC_BIND_ ## has_args (__VA_ARGS__)) #define BC_BIND_DISAMBIGUATE(has_args, ...) BC_BIND_DISAMBIGUATE2(has_args, __VA_ARGS__) #define BC_HAS_ARGS_IMPL(TWO, ONE, N, ...) N #define BC_HAS_ARGS(...) BC_SUBST(BC_HAS_ARGS_IMPL(__VA_ARGS__, 2, 1, ERROR)) #define BC_BIND(...) BC_BIND_DISAMBIGUATE(BC_HAS_ARGS(__VA_ARGS__), __VA_ARGS__) #define BC_BIND_1(fp) bc::detail::bind<decltype(fp), fp>() #define BC_BIND_2(mf, ip) bc::detail::bind<decltype(mf), mf>(ip) namespace bc // bicycle { template <typename Signature> class function; namespace detail { template <typename Signature> struct function_traits; template <typename ReturnType, typename ...ArgumentTypes> struct function_traits<ReturnType (*)(ArgumentTypes...)> { //typedef ReturnType (*Signature)(ArgumentTypes...); // MS error C3522: parameter pack cannot be expanded in this context typedef function<ReturnType (ArgumentTypes...)> function_type; template <typename Signature, Signature fp> static ReturnType wrapper(void const *, ArgumentTypes&& ... args) { return (*fp)(std::forward<ArgumentTypes>(args)...); } }; template <typename ReturnType, typename Class, typename ...ArgumentTypes> struct function_traits<ReturnType (Class::*)(ArgumentTypes...)> { //typedef ReturnType (Class::*Signature)(ArgumentTypes...); // MS error C3522: parameter pack cannot be expanded in this context typedef Class * class_ptr; typedef function<ReturnType (ArgumentTypes...)> function_type; template <typename Signature, Signature mf> static ReturnType wrapper(const void *ip, ArgumentTypes&& ... args) { Class* instance = const_cast<Class*>(static_cast<Class const *>(ip)); return (instance->*mf)(std::forward<ArgumentTypes>(args)...); } }; template <typename ReturnType, typename Class, typename ...ArgumentTypes> struct function_traits<ReturnType (Class::*)(ArgumentTypes...) const> { //typedef ReturnType (Class::*Signature)(ArgumentTypes...) const; // MS error C3522: parameter pack cannot be expanded in this context typedef const Class * class_ptr; typedef function<ReturnType (ArgumentTypes...)> function_type; template <typename Signature, Signature mf> static ReturnType wrapper(void const *ip, ArgumentTypes&& ... args) { Class const *instance = static_cast<Class const *>(ip); return (instance->*mf)(std::forward<ArgumentTypes>(args)...); } }; // bind free function template <typename Signature, Signature fp> typename function_traits<Signature>::function_type bind() { typedef function_traits<Signature> traits; return typename traits::function_type(&traits::template wrapper<Signature, fp>, 0); } // bind member function template <typename Signature, Signature mf> typename function_traits<Signature>::function_type bind(typename function_traits<Signature>::class_ptr ip) { typedef function_traits<Signature> traits; return typename traits::function_type(&traits::template wrapper<Signature, mf>, ip); } } template <typename ReturnType, typename ...ArgumentTypes> class function<ReturnType (ArgumentTypes...)> { typedef ReturnType (*StaticFuncPtr)(void const*, ArgumentTypes&& ...); public: function() : func_(0), data_(0) {} function(StaticFuncPtr f, void const *d) : func_(f), data_(d) {} ReturnType operator () (ArgumentTypes... args) const { #ifndef BC_NO_EXCEPTIONS if (!func_) throw std::bad_function_call(); #endif // BC_NO_EXCEPTIONS return (*func_)(data_, std::forward<ArgumentTypes>(args)...); } explicit operator bool() const { return 0 != func_; } bool operator == (function const &other) const { return func_ == other.func_ && data_ == other.data_; } bool operator != (function const &other) const { return !(*this == other); } private: StaticFuncPtr func_; void const *data_; }; }