C ++ рдореЗрдВ рдПрдирд╛рд▓реЙрдЧ рд╕реНрдХреЛрдк (рдПрдХреНрдЬрд┐рдЯ)

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

рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдлрд╝рдирдХрд╛рд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
class exit_scope { public: template< typename Callback > exit_scope( const Callback& callback ):caller_( new caller<Callback>(callback) ){} ~exit_scope(){ caller_->call(); delete caller_; } private: exit_scope(); exit_scope(const exit_scope&); exit_scope& operator =(const exit_scope&); struct caller_interface { virtual ~caller_interface(){} virtual void call()=0; }; template< typename Callback > struct caller: caller_interface { caller( const Callback& callback ): callback_(callback){} virtual void call(){ callback_(); } Callback callback_; }; caller_interface* caller_; }; 

рдЕрдм рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 int test() { std::string omega; std::cin >> omega; exit_scope guard1 = [&](){ std::cout<< "First exit scope "<<omega<<std::endl; }; return 0; } 

рдЕрднреА рддрдХ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред
рд╣рдмреНрд░реЗ рдкрд░ рдореИрдХреНрд░реЛрдВ рдХреЗ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдмрд╛рдж рд╕реЗ, рд╣рдо рдЙрдирдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ:
 #define EXIT_SCOPE_CREATE_UNIQ_NAME2(line) exit_scope_guard_##line #define EXIT_SCOPE_CREATE_UNIQ_NAME(line) EXIT_SCOPE_CREATE_UNIQ_NAME2(line) #define EXIT_SCOPE exit_scope EXIT_SCOPE_CREATE_UNIQ_NAME(__LINE__) = [&]() 

рдЕрдм рдХреЛрдб рдореЗрдВ рдЖрдк рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 int test1() { std::string omega; std::cin >> omega; EXIT_SCOPE{ std::cout << "Second exit scope" << omega<< std::endl; }; EXIT_SCOPE{ std::cout << "Third exit scope" << omega<<std::endl; }; return 0; } 

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ - рдмрд╣реБрдд рдмреЗрд╣рддрд░ред
рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд░реНрдЧ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, std :: function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
 class exit_scope { public: template< typename Callback > exit_scope( const Callback& callback ):callback_(callback){} ~exit_scope(){ callback_(); } private: exit_scope(); exit_scope(const exit_scope&); exit_scope& operator =(const exit_scope&); std::function<void(void)> callback_; }; 

рдЪреВрдВрдХрд┐ рд╣рдо рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рдХреНрдпрд╛ рд╣реИ), рд╣рдо рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рд╕рдорд╛рди рддрдВрддреНрд░ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╣ рдирдП рдорд╛рдирдХ рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рдЙрдард╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ, рдореЗрд░реЗ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред
рдмреВрд╕реНрдЯ / рд╕реНрдХреЛрдк_рдПрдХреНрд╕рд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рдЗрд╕ рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛:
 int test1() { std::string omega; std::cin >> omega; BOOST_SCOPE_EXIT( (&omega) ) { std::cout << "Fourth exit scope" <<omega<< std::endl; } BOOST_SCOPE_EXIT_END return 0; } 

рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХрдорд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ, рдореИрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рд╢реАрд░реНрд╖рдХ рдФрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреЛрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред


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


All Articles