-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80


goto vs break & continue

Вторник, 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

Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку