Войти
ФлеймФорумПрограммирование

Выполнение действия перед выходом из функции (без всяких goto)

Страницы: 1 2 3 4 5 6 7 Следующая »
#0
(Правка: 21:15) 21:13, 8 мая 2019

В общем, прикинул себе способ выполнения некого действия перед непосредственным return из функции, что бы каждый раз одно и тоже не писать в куче разных мест и не использовать goto, который кстати тоже пришлось бы писать в куче разных мест.

Применение:

bool Processor::initialize()
{
    SuperClass* pointer = new SuperClass;
    ReturnWatcher rt([&]() { if(pointer)delete pointer; }); //вот эта штука

    if(...)
    {
        //if(pointer) //ЭТО УЖЕ НЕ НУЖНО ПИСАТЬ :)
          //  delete pointer;
        return false;
    }
    else if(...)
    {
        //if(pointer) //ЭТО УЖЕ НЕ НУЖНО ПИСАТЬ :)
          //  delete pointer;
        return false;
    }
    else if(...)
    {
        //if(pointer) //ЭТО УЖЕ НЕ НУЖНО ПИСАТЬ :)
          //  delete pointer;
        return false;
    }
    else
        return true;
}

а вот сам ReturnWatcher

class ReturnWatcher
{
public:
    ReturnWatcher(std::function<void(void)> fp) : m_fp(fp) {}
    ~ReturnWatcher() { m_fp(); }
    std::function<void(void)> m_fp;
};

то есть по факту я при создание на стэке объекта класса ReturnWatcher передаю ему в конструктор указатель на лямбду с полезными действиями, соответственно при выходе из целевой функции кол-нится дестркутор, а оттуда полезная функция...

Что мне не нравится:
если я напишу объявление указателя ниже лямбды, то она его уже не увидит, не смотря на захват &, по этому все указатели, да и просто другие объекты, с которыми нужно выполнять действия перед выходом, нужно объявить заранее перед лямбдой прямо как в С, что мне кажется кривотой...

+ не_найдёт_указатель

Может есть решения поэлегантнее?


#1
(Правка: 21:22) 21:20, 8 мая 2019

™­•-=MASTER=-•™
> Может есть решения поэлегантнее?
shared_ptr или что там сейчас место auto_ptr?
Я понимаю такую возню в С, но в C++ то зачем?

#2
21:27, 8 мая 2019

exchg
> shared_ptr или что там сейчас место auto_ptr?
> Я понимаю такую возню в С, но в C++ то зачем?
я кстати так и не пересел на эти шаред поинтеры, слишком стар наверное :) точнее, был какой-то баг из-за этого, долго искал...забил в общем
Но дело не в этом, ведь полезное действие может быть не только с удалением указателей, но и с установкой каких-то флагов или просто, например, с закрытием файла:

QFile file("trulala.txt");
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return false;
QTextStream ts(&file);
//return
...
//return
...
//return
и тд
ReturnWatcher rt([&]() { file.close(); });
#3
21:37, 8 мая 2019

™­•-=MASTER=-•™
> Но дело не в этом, ведь полезное действие может быть не только с удалением
> указателей, но и с установкой каких-то флагов или просто, например, с закрытием
> файла:

Ну так при выходе из скопа вызывается деструктор, внутри которого хоть файл закрывай хоть в лог пиши.
Т.е. в самом примитивном виде делаешь класс враппер с нужным тебе деструктором и конструктором.

#4
22:01, 8 мая 2019

exchg
> Ну так при выходе из скопа вызывается деструктор, внутри которого хоть файл
> закрывай хоть в лог пиши.
так я такое решение и показал в нуль посте с ReturnWatcher-ом, но его нужно объявлять после всех объявлений и перед первым возможным return_ом, что не очень удобно...
Ладно, наверное тут тоже ничего не поделаешь... добавляют какую-то хрень в новые стандартах, одна мишура для выпендрёжа перед джунами и ничего реально полезного...

#5
22:05, 8 мая 2019

Открой для себя смартпоинтеры
/facepalm

™­•-=MASTER=-•™
> точнее, был какой-то баг из-за этого, долго искал...забил в общем
Руки из жопы?

™­•-=MASTER=-•™
> Но дело не в этом, ведь полезное действие может быть не только с удалением
> указателей, но и с установкой каких-то флагов или просто, например, с закрытием
> файла:
Для этого деструкторы и придумали...

#6
22:06, 8 мая 2019

™­•-=MASTER=-•™
> Что мне не нравится:
> если я напишу объявление указателя ниже лямбды, то она его уже не увидит, не
> смотря на захват &, по этому все указатели, да и просто другие объекты, с
> которыми нужно выполнять действия перед выходом, нужно объявить заранее
С goto проще.
Из-за первобытного страха перед ним люди готовы устраивать себе геморрой который многократно превосходит по запутанности этот самый goto. Готовы рушить архитектуру и городить костыльные кренделя.

#7
22:13, 8 мая 2019

А у меня все хорошо
https://rextester.com/AOV52106

#8
(Правка: 22:33) 22:14, 8 мая 2019

1 frag / 2 deaths
> Для этого деструкторы и придумали...
ты нульпост почитай перед тем как нести пургу как обычно, у функций нет деструкторов
122
> С goto проще.
> Из-за первобытного страха перед ним
да не, страха особо нет, хотя есть опасения быть опозоренным перед хэйтерами goto, если увидят твой код :) и всплывают какие-то старые байки об обрушение стэка... я его иногда использую, правда редко, им просто нужно уметь пользоваться и знать, что конкретно он делает... P.S.: то же самое с выходом из многовложенных циклов, где в самом внутреннем делаешь брейк, а потом по какой-то переменной типа bool exit делаешь брейк во всех 10-и что выше, тоже бред, т.к. проще поставить goto, вот:

+ без_goto
+ с_goto

то есть зачем как-то выпендриваться, трястись перед goto, загромождать код, увеличивать кол-во вызовов (в хай-лоад это критично), если можно поставить goto :)
#9
22:41, 8 мая 2019

122
> С goto проще.
+1

#10
22:42, 8 мая 2019

™­•-=MASTER=-•™
> ты нульпост почитай перед тем как нести пургу как обычно, у функций нет
> деструкторов
У функций нет, у объектов есть, можно городить всякие темы типа finally и всё такое

#11
(Правка: 22:52) 22:44, 8 мая 2019

mr.DIMAS
> +1
+1, всё, убираю эту хрень с лямдами и леплю везде на goto
1 frag / 2 deaths
> У функций нет, у объектов есть, можно городить всякие темы типа finally и всё
> такое
ты вообще понял про что речь?

#12
(Правка: 23:05) 23:04, 8 мая 2019

™­•-=MASTER=-•™
> ты вообще понял про что речь?
Да. А ты вообще понял, что я понял, про что речь?

#13
23:22, 8 мая 2019

™­•-=MASTER=-•™
> без_goto
оборачиваешь в функцию и делаешь ретурн.
Это уже не говоря о том что 100500 вложенных циклов обычно нинужны и это прямо означает что с алгоритмом что-то не так.

#14
(Правка: 23:41) 23:32, 8 мая 2019

Super_inoy
> оборачиваешь в функцию и делаешь ретурн.
да...оборачиваешь, делаешь отдельную функцию, используемую только в одном месте, засирая namespace, или делаешь встроенную кривую лямбду в функции, потом туда всё по ссылкам передаёшь, лишний вызов функции и тд и и тп...не кажется ли тебе это гораздо большим извращением, чем простой goto, чем он обидел? :-)
> Это уже не говоря о том что 100500 вложенных циклов обычно нинужны и это прямо
> означает что с алгоритмом что-то не так.
в алгоритмах такое сплошь и рядом

Страницы: 1 2 3 4 5 6 7 Следующая »
ФлеймФорумПрограммирование