рд╕рдореБрджрд╛рдп рдХреЛ рдмрдзрд╛рдИ!
рдореБрдЭреЗ C ++ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛, рдЬреЛ рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЗ рдЕрдВрджрд░ рдлрдВрдХреНрд╢рдиреНрд╕ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
#include <iostream> int main() { inline_function(std::string s) { std::cout << "Hello, " << s << "!\n"; } with_name(make_hello); make_hello("Vasiliy Pupkin!"); return 0; }
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░, рдПрдХ рдиреЗрд╕реНрдЯреЗрдб "рд╡рд┐рдзрд┐" рдирд╛рдо make_hello рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреИрд░рд╛рдореАрдЯрд░ "рд╡рд╛рд╕рд┐рд▓реА рдкреБрдкрдХрд┐рди" рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╢рдХ,
Hello, Vasiliy Pupkin!
ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдирд╛рдо рдХреЛ рдКрдкрд░ рдирд╣реАрдВ рдЦреАрдВрдЪ рд╕рдХрд╛ред
рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдХреНрд░реЛрдЬрд╝ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдмрд┐рдирд╛ рдЙрд╕реА рдХреЗ рдЙрджрд╛рд╣рд░рдг
C ++ рдореЗрдВ, рдЕрднреА рднреА
рдХреЛрдИ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди
рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рдХреЗ рд╕рд╛рде рдЙрдирдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рдкреВрдЫрддреЗ рд╣реИрдВ: рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ?
рджреЛ рдЙрддреНрддрд░ рд╣реИрдВ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ "рд╢реВрдиреНрдп рдореЗрдВ" рдмрдирд╛рдП рдмрд┐рдирд╛ рдХрдХреНрд╖рд╛ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛:
#include <stdio.h> int main() { // class inline_function { public: // inline_function() { printf("Hello, hell!\n"); } }; // inline_function(); return 0; }
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг "рдмрдЯ" рд╣реИрдВ рдЬреЛ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ:
1. рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдЦреИрд░, рдореИрдВ рдХрдИ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд╕рд╛рдЗрдХрд┐рд▓ рдЪрд▓рд╛рдКрдВ? рдРрд╕реА рдЪреАрдЬрд╝ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рддрдереНрдп рдкрд░ рдУрд╡рд░рд╣реЗрдб рд▓рд╛рдЧрдд рдХреЛ рд╕рд╣рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧ рдкрд░ рдирд╣реАрдВред
2. рдХрдВрдкрд╛рдЗрд▓рд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд╛рд▓рд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдмреЗрдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирд▓рд╛рдЗрди_рдлрдВрдХреНрд╢рди () рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдХрд╛ рддрд░реНрдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рд╡реИрд╕реЗ рднреА, рдХреЛрдИ рднреА рдЗрд╕ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреНрдпреЛрдВ рдмрдирд╛рдПрдВ?) рд▓реЗрдХрд┐рди рдпрд╣ рдЦрддрд░рдирд╛рдХ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрднреА рднреА "рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдкреБрдирд░реНрд╡рд┐рддрд░рдг" рдирд╛рдордХ рдПрдХ рдЪреАрдЬ рд╣реИ - рдФрд░ рд╣рдо рдбрдмрд▓ рдмреНрд░реИрдХреЗрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕реНрдорд╛рд░реНрдЯрд▓реА рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдСрдкрд░реЗрдЯрд░ () рдХреЛ "рдлрд╝рдиреНрдХреНрдЯрд░" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ):
#include <stdio.h> int main() { // class inline_function_class { public: void operator()() { printf("Hello, world!\n"); } }; // -- ! inline_function_class inline_function; // inline_function(); return 0; }
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдареАрдХ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╡рд░реНрдЧ рдХреЛ рдЧреБрдордирд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдкрдХреЛ
inline_function_class
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо
inline_function_class
рдЖрд╡рд╢реНрдпрдХрддрд╛ рди
inline_function_class
#include <stdio.h> int main() { // class { public: void operator()() { printf("Hello, world!\n"); } } inline_function; // // inline_function(); return 0; }
рд░рд╛рдЗрдЯрд┐рдВрдЧ рдореИрдХреНрд░реЛрдЬрд╝
рддреЛ, рд▓рдХреНрд╖реНрдп - рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ - рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рддрд░реАрдХреЗ рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рддрд╛рдХрд┐ рдмрд╛рд╣рд░реА рджреГрд╢реНрдпрддрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЦрд░рд╛рдм рди рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдПрдХ рдорд╛рдЗрдирд╕ рд╣реИ: рджрд┐рдП рдЧрдП рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ - рдореЗрд░реЗ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП - рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдХреНрд╖рд░ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ:
#include <stdio.h> int main() { // /** -- , , : **/ class { public: void operator()(/* */) { /** -- , , **/ printf("Hello, world!\n"); /** -- **/ } } inline_function; // /** =============================== **/ // inline_function(); return 0; }
рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рджреЛ рдореИрдХреНрд░реЛрдВ рдореЗрдВ рд╕рдореЗрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдирд╛рдо рдорд┐рд▓реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
#define inline_function(params) \ class \ { \ public: void operator() (params)\ {\ #define with_name(value) \ }\ } value; #define with_params(...) __VA_ARGS__
рдЗрди рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, "рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди" рдХреЗ рдХреЛрдб рдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реА рд╕реНрдЯрд╛рдЗрд▓ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ):
int main() { inline_function(char * name) { printf("Hello, %s!\n",name); } with_name(hello) hello("Pupkin"); }
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдм рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрдо рд╕реЗ рдХрдо рджреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдЗрдирд▓рд╛рдЗрди_рдлрдВрдХреНрд╢рди рдореИрдХреНрд░реЛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдмрд╛рд╕реНрдЯрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХреЛ __VA_ARGS__ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдорд╛рдирдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ)ред
рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рд╕реНрд╡реАрдХрд╛рд░реНрдп, рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рджрд┐рдЦреЗрдЧрд╛:
int main() { inline_function (with_params(int a, int b)) { printf("%d+%d=%d\n",a,b,a+b); } with_name(plus); plus(2,2); }
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐
рдЗрди рдореИрдХреНрд░реЛ рдХрд╛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдирд╣реАрдВ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ "рдлреЗрдВрдХ рджрд┐рдпрд╛" рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред
рдкреАрдПрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдиреЗрд╕реНрдЯреЗрдб рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреА рддрдХрдиреАрдХ рджреБрдирд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрд░рд╛рдиреА рд╣реИ, рдФрд░ рдореИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рдЦреЛрдЬ рдкрд╛рдпрд╛ред рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд▓реЗрдЦ рдПрдХ рд╢реИрдХреНрд╖рд┐рдХ рдЕрд░реНрде рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕реМрдВрджрд░реНрдп рдкреВрд░реНрдгрддрд╛ рд╣реИред