Перейти к содержимому
Задача · Память и умные указатели · урок 10 из 12

Задача: ScopeGuard

Напишите класс ScopeGuard, который выполняет действие при выходе из блока. Конструктор ScopeGuard(Callback cb, int& target) запоминает функцию cb и переменную target, а деструктор ~ScopeGuard() вызывает cb(target) ровно один раз. Копирование ScopeGuard запретите, а поля добавьте сами.

Тип Callback уже объявлен в файле: это указатель на функцию вида void f(int&), и вызывают его так же, как функцию. В тестах increment прибавляет к своему аргументу единицу.

  • после блока { ScopeGuard guard(increment, calls); } значение calls растёт с 0 до 1
  • пока guard существует, calls не меняется
  • std::is_copy_constructible_v<ScopeGuard> → false

Ограничения: target живёт дольше объекта ScopeGuard, а вложенные ScopeGuard срабатывают каждый при выходе из своего блока, начиная с внутреннего.

scope_guard.cpp — cpp
cpp · строк: 11
Ctrl+Enter запуск · Esc выйти из редактора