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

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

Страницы: 1 2 3 4 5 6 7 Следующая »
#15
0:32, 9 мая 2019

копипаст отсюда https://pastebin.com/SX3mSC9n

+ Показать

используется например так:

void test()
{
  HKEY main_key;
  auto rc = RegOpenKeyExA(..., &main_key);
  if (rc != S_OK) return;
  defer { RegCloseKey(main_key); };
  //bla bla bla main_key
}

не интересно городить обертку для каждой фигни, которая используется один-два раза


#16
(Правка: 3:50) 3:42, 9 мая 2019

™­•-=MASTER=-•™

Сам этот концепт называется exit scope и лучше еще для краткости в макрос завернуть. Я использую как finally. Обсуждалось на форуме не раз.
Вообще это очень хороший концепт, имхо, лучше, чем классические try/finally, т.к. соединяет место инициализации "неуправляемой" переменной с конкретным кодом по её подчистке и сразу же делает то, что во всяких дельфях делается ниже по коду в блоке finally, что даёт меньшую наглядность и контроль.

> нужно объявить заранее перед лямбдой прямо как в С, что мне кажется кривотой...

Напротив это естественное свойство областей видимости C++ защищающее код от криворуких программистов.
Почему так - потому что если чуть ниже по коду случится исключение, то такая лямбда может по итогу попытаться лезть в несконструированный объект и будет ой.

#17
3:48, 9 мая 2019

™­•-=MASTER=-•™
> а вот сам ReturnWatcher

Еще его лучше сделать шаблонным классом от произвольного функтора, т.к. std::function может вовлекать иногда ненужные расходы.

#18
(Правка: 5:06) 5:05, 9 мая 2019

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

#19
(Правка: 5:19) 5:19, 9 мая 2019

Suslik
> лишь бы не утруждать себя изучением смартпойнтеров

Бывает полезно особенно когда взаимодействуешь со сторонними библиотеками.
Например я работаю с SDL2 и конечно в целом везде натыкал обёрток над всякими SDL_CreateTexture/SDL_FreeTexture с рефкаунтами, библиотекой ресурсов и прочим, но иногда нужно просто перегрузить на лету текстуру из SDL_Surface сделав пару преобразований на лету для генерации SDL_Texture, но сама SDL_Surface не нужна нигде и обёртки над ней тоже. Поэтому фьють - после успешного выделения tempSurface через всякие многочисленные SDL_CreateRGBA_from_file пишем finally и не паримся ни насчёт исключений ни насчёт левых ненужных классов.

#20
(Правка: 6:12) 6:09, 9 мая 2019

=A=L=X=
> но иногда нужно просто перегрузить на лету текстуру из SDL_Surface сделав
я C-библиотеку без двойного презерватива ++ обёртки с деструктором даже веткой потыкать не решусь. в результате я уже несколько лет не писал код очистки ресурсов в бизнес-коде, вообще нигде и ни для чего.

UPD из полезных находок из этого треда могу выделить хипстерский символ :

#21
(Правка: 6:22) 6:21, 9 мая 2019

Suslik
> я C-библиотеку без двойного презерватива ++ обёртки с деструктором даже веткой
> потыкать не решусь

Так это и есть такая обёртка, только не через обёрточный класс, а через очень простую одну строчку finally.
Иногда это проще и понятнее, чем громождение полноценного обёрточного класса или даже специализации smart_ptr под кастомный deleter.
Просто чище и красивее выглядит.
Но по факту число место очень ограничено - это там где нет массовой работы, а нужно сиюминутное действие с чем то unmanaged.
Например у меня в проекте на более чем три десятка классов (и их число будет расти) со строгим управлением под рефкаунтами и библиотеками ресурсов finally же используется в двух или трёх строках из тысяч кода.
Ну вот просто есть места где оно редко, но проще и уместнее.

Собственно в буст такое запили давно уже тоже: https://www.boost.org/doc/libs/1_61_0/libs/scope_exit/doc/html/index.html но та реализация уродливенькая, на C++11 можно намного красивее из-за лямбд фигачить.

#22
9:12, 9 мая 2019

=A=L=X=
> и лучше еще для краткости в макрос завернуть
да кстати
> Я использую как finally.
в смысле шарповское try/finally? Да ну... на самом деле goto куда более волшебен и гибок, можно хренову тонну точек безусловного перехода понавтыкать, не только finally, а finally1, finally2, finally3...finallyN, error1, error2, ok1, ok2 и т.д. ...  да и вообще это ближе к асм-му, что греет "душу" и позволяется в принципе делать очень крутые вещи с минимальным оверкилом по оп-кодам
> Напротив это естественное свойство областей видимости C++
ну может быть ты и прав, да
> Еще его лучше сделать шаблонным классом от произвольного функтора
здесь не очень понял...
Suslik
> о боги, какой только ерундой люди ни занимаются, лишь бы не утруждать себя
> изучением смартпойнтеров
я ж говорил, что exit scope необязательно связан с удалением указателей и едва ли они тебе помогут в этом (копипаст из предыдущих постов)

+ без_goto
+ с_goto

Suslik
> я C-библиотеку без двойного презерватива ++ обёртки с деструктором даже веткой
> потыкать не решусь. в результате я уже несколько лет не писал код очистки
> ресурсов в бизнес-коде
да... что-то ты, как говориться, попал не в ту струю, трансформируешься в гарбедж коллекторную домохозяйку :)  Наверное у тебя по работе уж совсем дефолтный софт пошёл, который можно генератором кода слепить... где ж авантюризм, стремление сделать быстрее, хардкорней, ближе к железу... 
#23
10:29, 9 мая 2019

™­•-=MASTER=-•™
> да... что-то ты, как говориться, попал не в ту струю, трансформируешься в
> гарбедж коллекторную домохозяйку :)
Вообще ничего общего.
Но ничего, мы в 20 лет тоже учились отличать кульного мамкиного какира, "контролирующего" всё руками, гц-домохозяйку, и адекватного программиста, настроившего автоматическое удаление ресурса в нужный и контролируемый момент.

#24
10:31, 9 мая 2019

™­•-=MASTER=-•™
Чувак, ты тупо не шаришь.
Я конечно люто презираю ненависников гото, но твоя позиция не менее неадекватна.

#25
(Правка: 10:48) 10:45, 9 мая 2019

™­•-=MASTER=-•™
> + без_goto
> + с_goto

+ нормальный_вариант

™­•-=MASTER=-•™
> да... что-то ты, как говориться, попал не в ту струю, трансформируешься в гарбедж коллекторную домохозяйку :)
я просто предпочитаю заниматься написанием кода, который мне интересно, а не тратить одну половину времени на удаление ресурсов, а вторую — на отладку, почему же оно не работает. и, вероятно, лучше всё-таки почитать, чем отличается gc от unique_ptr, потому что глуповато выглядит. например, можно поинтересоваться, какой asm код генерит unique_ptr.

#26
11:00, 9 мая 2019

Suslik
> нормальный_вариант
Это не объективно.

#27
11:36, 9 мая 2019

Suslik
> return;
а если в функции алгоритма много таких мест с вложенными циклами, будешь каждое оборачивать в функцию, которую наверное объявишь в хэдэере, понимая с грустным смайликом на лице, что она будет использоваться только в одном месте, передашь в неё по ссылкам всё барахло из родительской функции... ну хз хз... Можно конечно без засирания хэдэра лямбдой изловчиться, но разве вот такая вот запись не выглядит большим изращением, чем простое goto? Я уж молчу про то, что там будет куча лишних операций типа создание ссылок(захват же по ссылке), call функции, ret и пр... В goto такого ничего нет...

bool complexFunc()
{
    //...
    int a,b,c,d;
    //...
    auto DoExtremelyImportantStuff1 = [&]() -> bool
    {
        for(a = 0; a < 100; a++)
        {
          for(b = 0; b < 100; b++)
          {
              for(c = 0; c < 100; c++)
              {
                  for(d = 0; d < 100; d++)
                  {
                      if(a == 5 && b == 6 && c == 7 && d == 10)
                      {
                          return false;
                      }
                  }
              }
          }
        }

        return true;
    };

    if(!DoExtremelyImportantStuff1())
    {    
        //DoSomething
    }
    //...
}

#28
11:41, 9 мая 2019

™­•-=MASTER=-•™
> в алгоритмах такое сплошь и рядом
Если писать говнокод не думая о сложности - конечно.

#29
11:45, 9 мая 2019

Super_inoy
> Если писать говнокод не думая о сложности
как перестанешь хелоу-ворлдны ковырять, подумаешь ещё раз над своим высказыванием

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