Вторник, 14 Июля 2020 г. 01:20
+ в цитатник
Qraizer: На, вот. Отрыл-таки в Клубе энтот твой scope. Без Поиска, он не работает. Скопипасчу, не жалко.
namespace ScopeD
{
class SuccessCase {} success;
class FailureCase {} failure;
class DoneCase {} done;
class scope
{
std::function fn1, fn2;
public:
template scope(SuccessCase, T&& cl) try : fn1(std::move(cl)), fn2([](){}) {} catch (...) { throw; }
template scope(FailureCase, T&& cl) try : fn1([](){}), fn2(std::move(cl)) {} catch (...) { cl(); throw; }
template scope(DoneCase, T&& cl) try : fn1(std::move(cl)), fn2(fn1) {} catch (...) { cl(); throw; }
~scope() { if (std::uncaught_exceptions() != 0) fn2(); else fn1(); }
};
}
И использование
последнего примера отсюда тоже
using namespace ScopeD;
struct Foo
{
Foo(std::string s) { std::cout << s; }
~Foo() { std::cout << "1"; }
};
try
{
scope guard1(done, [](){ std::cout << "2"; });
scope guard2(success, [](){ std::cout << "3"; });
Foo f("0");
scope guard3(failure, [](){ std::cout << "4"; });
throw std::runtime_error("runtime");
scope guard4(done, [](){ std::cout << "5"; });
scope guard5(success, [](){ std::cout << "6"; });
scope guard6(failure, [](){ std::cout << "7"; });
}
catch (const std::exception& e)
{
std::cout << "Exception: " << e.what();
}
std::cout << std::endl;
https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834214
Метки:
Holy Wars
-
Запись понравилась
-
0
Процитировали
-
0
Сохранили
-