SerJook
@SerJook
кодер

Как выполнить некоторый код при выходе из функции?

Предположим у меня есть несколько точек выхода (return) из функции и надо обязательно выполнить некий код при выходе из функции. Можно выделить этот код в функцию, но можно забыть ее вызвать. Использовать goto не хочу.
Есть ли в C++ готовое решение для таких случаев? Хотелось бы что-нибудь очень простое вроде:

void function() {
  run_at_return([]{ /*do something */ });
  //...
   if (condition) {
       return;
   }
   //...
   if (condition2){
      return;
   }
}
  • Вопрос задан
  • 186 просмотров
Решения вопроса 1
@Alexander1705
Можно воспользоватся деструктором. Не забывайте, что нельзя бросать исключения в деструкторе.
#include <iostream>
#include <functional>

template <typename T>
class defer {
private:
    std::function<T()> mFunctor;
public:
    defer(std::function<T()> functor) : mFunctor(functor) {}
    ~defer() { mFunctor(); }
};

int main() {
    defer<void> d([] { std::cout << "Deferred func!" << std::endl; });
    //...
    
    std::cout << "Hello, world!" << std::endl;
    
    if (true) {
        return 0;
    }
    //...
    if (false){
        return 1;
    }
    
    return 0;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@xxx3Vxxx
Программист C++
...
auto f = []{ cout << "asdf"; };
...
class invoker
{
public:
    ~invoker()
    {
        fn();
    }
    decltype(f) fn = f;
};

    invoker c;
...


Писал с телефона, сорри если есть опечатки.
Ответ написан
Комментировать
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Не вопрос (C++17, свёртка):
template<typename... Funcs>
auto compose_sq(Funcs&&... funcs)
{
    return [=]{ (std::invoke(funcs), ...); };
}

int main()
{
    auto f1 = []{ std::cout << "f1" << std::endl; };
    auto f2 = []{ std::cout << "f2" << std::endl; };
    auto f3 = compose_sq(f1, f2);
    f3();

    return 0;
}

Ну а если нужно сохранить результат возврата значения первой функции, то придётся ещё немного кода написать. Думаю, что общее направление вам понятно. Если что, то дополнительную информацию можно найти тут: https://en.cppreference.com/w/cpp/language/fold
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы