| 1 2 |
| Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | MaximE![]() | ||
| Дата: | 20.09.03 23:11 | ||
| Оценка: | 199 (20) | ||
| Думаю, многие знакомы с ScopeGuard. Мне очень понравилась его идея, но только он не привел исходников — видимо, по его мнению, любой желающий может сам реализовать эту кучу байндеров. Последнее время мне много приходится работать с legacy кодом, поэтому проблема стала для меня крайне острой. Будучи ленивым по натуре, я хотел использовать что-либо готовое. Но готового ScopeGuard я не мог найти. Решение — паразитировать на boost::bind. Преимущество данного решения в том, что не нужно реализовывать кучу байндеров вручную, причем для разных calling conventions, — все уже давно реализовано в boost::bind.
Пример использования:
|
| Re: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | alexkro![]() | ||
| Дата: | 21.09.03 06:48 |
| Здравствуйте, MaximE, Вы писали: ME>Думаю, многие знакомы с ScopeGuard. ME>Мне очень понравилась его идея, но только он не привел исходников — видимо, по его мнению, любой желающий может сам реализовать эту кучу байндеров. Почему не привел? В этом архиве они (ftp://ftp.cuj.com/pub/2000/cujdec2000.zip). |
| Re[2]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | MaximE![]() | ||
| Дата: | 21.09.03 08:34 |
| Здравствуйте, alexkro, Вы писали: A>Здравствуйте, MaximE, Вы писали: ME>>Думаю, многие знакомы с ScopeGuard. ME>>Мне очень понравилась его идея, но только он не привел исходников — видимо, по его мнению, любой желающий может сам реализовать эту кучу байндеров. A>Почему не привел? В этом архиве они (ftp://ftp.cuj.com/pub/2000/cujdec2000.zip). Посыпаю голову пеплом — не мог найти Но все равно с boost::bind как-то милее сердцу |
| Re: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | Аноним 657 | ||
| Дата: | 21.09.03 14:11 | ||
| Оценка: | 53 (4) | ||
| Здравствуйте, MaximE, Вы писали: <...> Вах ! Однако меня несколько коробит повторяющаяся последовательность "make_guard(boost::bind(" и почти всегда совершенно ненужные переменные g1,g2. А вот как бы добавить макросов, чтобы можно было писать
? Интересная задача. Если только не останавливаться на варианте с двойными скобками
, надо как-то модифицировать выражение scope_guard g2(make_guard(boost::bind(&free, p))) так, чтобы в конце была одна скобка. Тогда
И вуаля ! Однако боюсь, что иного варианта кроме написания make_guard_ex для количества аргументов [1...N] нет... Зато пользователи (и кода и гуарда) будут довольны ! |
| Re[2]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | MaximE![]() | ||
| Дата: | 21.09.03 15:01 |
| Здравствуйте, Аноним, Вы писали: А>Здравствуйте, MaximE, Вы писали: <...>> А>Вах ! Однако меня несколько коробит повторяющаяся последовательность "make_guard(boost::bind(" ... Да, меня это тоже несколько подплющивает А>... и почти всегда совершенно ненужные переменные g1,g2. А вот как бы добавить макросов, чтобы можно было писать А вот про ненужные переменные я даже не задумывался. [] А>Однако боюсь, что иного варианта кроме написания make_guard_ex для количества аргументов [1...N] нет... Зато пользователи (и кода и гуарда) будут довольны ! Отличная идея. |
| Re[3]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | Дмитрий Наумов![]() | ||
| Дата: | 21.09.03 16:48 | ||
| Оценка: | 14 (1) | ||
| Здравствуйте, MaximE, Вы писали: А>>Вах ! Однако меня несколько коробит повторяющаяся последовательность "make_guard(boost::bind(" ... ME>Да, меня это тоже несколько подплющивает Господа, о чем это вы?! А как же приведенный в той статье и в исходника макрос ON_EXIT??? А>>... и почти всегда совершенно ненужные переменные g1,g2. А вот как бы добавить макросов, чтобы можно было писать ME>А вот про ненужные переменные я даже не задумывался. В вышеупомянутом макросе и решается проблема создания "безымянных" переменных... |
| Re[4]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | MaximE![]() | ||
| Дата: | 21.09.03 17:04 |
| Здравствуйте, Дмитрий Наумов, Вы писали: ДН>Здравствуйте, MaximE, Вы писали: А>>>Вах ! Однако меня несколько коробит повторяющаяся последовательность "make_guard(boost::bind(" ... ME>>Да, меня это тоже несколько подплющивает ДН>Господа, о чем это вы?! А как же приведенный в той статье и в исходника макрос ON_EXIT??? А>>>... и почти всегда совершенно ненужные переменные g1,g2. А вот как бы добавить макросов, чтобы можно было писать ME>>А вот про ненужные переменные я даже не задумывался. ДН>В вышеупомянутом макросе и решается проблема создания "безымянных" переменных... Да, точно.
|
| Re[4]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | MaximE![]() | ||
| Дата: | 21.09.03 18:40 |
| Здравствуйте, Дмитрий Наумов, Вы писали: ДН>Здравствуйте, MaximE, Вы писали: А>>>Вах ! Однако меня несколько коробит повторяющаяся последовательность "make_guard(boost::bind(" ... ME>>Да, меня это тоже несколько подплющивает ДН>Господа, о чем это вы?! А как же приведенный в той статье и в исходника макрос ON_EXIT??? Здесь нам придется завернуть два вызова функций, поэтому если далать макрос как в оригинальной статье, то его использование будеть выглядеть примерно так:
Не очень элегантно, да? |
| Re[5]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | Дмитрий Наумов![]() | ||
| Дата: | 22.09.03 06:38 |
| Здравствуйте, MaximE, Вы писали: ME>
ME>Не очень элегантно, да? Насчет двух закрывающих скобок совсем не понял... |
| Re[6]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | MaximE![]() | ||
| Дата: | 22.09.03 08:01 |
| Здравствуйте, Дмитрий Наумов, Вы писали: ДН>Здравствуйте, MaximE, Вы писали: ME>>
ME>>Не очень элегантно, да? ДН>Насчет двух закрывающих скобок совсем не понял... Если мы напишем подобный макрос:
пользовать его придется так:
|
| Re[7]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | MaximE![]() | ||
| Дата: | 22.09.03 08:05 |
| Здравствуйте, MaximE, Вы писали: ME>Если мы напишем подобный макрос: Вот такой макрос (для VC2003):
|
| Re[8]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | Дмитрий Наумов![]() | ||
| Дата: | 22.09.03 08:15 |
| Здравствуйте, MaximE, Вы писали: ME>Здравствуйте, MaximE, Вы писали: ME>>Если мы напишем подобный макрос: Я чего то не понимаю... Зачем писать свой? Почему не использовать предложенный авторами? |
| Re[8]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | Дмитрий Наумов![]() | ||
| Дата: | 22.09.03 08:22 |
| Здравствуйте, MaximE, Вы писали: ME>Здравствуйте, MaximE, Вы писали: ME>>Если мы напишем подобный макрос: Ну или даже если нам очень захотелось по своему переписать:
то есть маленькое несоответсвие с идеей автора —
и тогда, насколько я понимаю открывающая скобка перед util:make_guard не нужна... Возможно, правда, это все связано с BOOST_PP_CAT — я, к сожалению, не сильный знаток буста, так что звиняйте если не прав. |
| Re[9]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | MaximE![]() | ||
| Дата: | 22.09.03 08:29 |
| Здравствуйте, Дмитрий Наумов, Вы писали: ДН>Здравствуйте, MaximE, Вы писали: ME>>Здравствуйте, MaximE, Вы писали: ME>>>Если мы напишем подобный макрос: ДН>Ну или даже если нам очень захотелось по своему переписать: ДН>
ДН>то есть маленькое несоответсвие с идеей автора — ДН>
ДН>и тогда, насколько я понимаю открывающая скобка перед util:make_guard не нужна... Да, можно избавиться от одной пары скобок, применив copy initialization (заменить scoped_guard s(make_guard(...)), на scoped_guard s = make_guard(...)), но это пробемы не решает, т.к. у нас два вызова функций ( make_guard(bind(...)) ) и, соответственно, нам нужно закрыть две скобки. |
| Re[10]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | Дмитрий Наумов![]() | ||
| Дата: | 22.09.03 09:01 | ||
| Оценка: | 9 (1) | ||
| Здравствуйте, MaximE, Вы писали: ME>Да, можно избавиться от одной пары скобок, применив copy initialization (заменить scoped_guard s(make_guard(...)), на scoped_guard s = make_guard(...)), но это пробемы не решает, т.к. у нас два вызова функций ( make_guard(bind(...)) ) и, соответственно, нам нужно закрыть две скобки. Но и открыть две, разве не так?
Имхо, выглядит очень даже обычно и прилично... |
| Re[11]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | MaximE![]() | ||
| Дата: | 22.09.03 09:06 |
| Здравствуйте, Дмитрий Наумов, Вы писали: ДН>Здравствуйте, MaximE, Вы писали: ME>>Да, можно избавиться от одной пары скобок, применив copy initialization (заменить scoped_guard s(make_guard(...)), на scoped_guard s = make_guard(...)), но это пробемы не решает, т.к. у нас два вызова функций ( make_guard(bind(...)) ) и, соответственно, нам нужно закрыть две скобки. ДН>Но и открыть две, разве не так? ДН>
ДН>Имхо, выглядит очень даже обычно и прилично... Если не пытаться загнать bind внутрь макроса, то да |
| Re[12]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | Дмитрий Наумов![]() | ||
| Дата: | 22.09.03 09:11 |
| Здравствуйте, MaximE, Вы писали: ME>Если не пытаться загнать bind внутрь макроса, то да К такой ошеломляющей "наглости" я не был готов... Bind...внутри макроса...Победа нокаутом А если не секрет — неужели так надо его именно внутрь запихнуть? |
| Re[13]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | MaximE![]() | ||
| Дата: | 22.09.03 09:42 |
| Здравствуйте, Дмитрий Наумов, Вы писали: ДН>Здравствуйте, MaximE, Вы писали: ME>>Если не пытаться загнать bind внутрь макроса, то да ДН>К такой ошеломляющей "наглости" я не был готов... Bind...внутри макроса...Победа нокаутом ДН> ДН>А если не секрет — неужели так надо его именно внутрь запихнуть? Не знаю Меня без макросов вполне устраивает. |
| Re[14]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | Дмитрий Наумов![]() | ||
| Дата: | 22.09.03 09:53 |
| Здравствуйте, MaximE, Вы писали: ME>Не знаю ME>Меня без макросов вполне устраивает. Позвольте угадаю сей до боли знакомый (по себе самому) эффект — так понравилась статья, что до конца не дочитал — бросился использовать! |
| Re[15]: Ленивый ScopeGuard (не путать с голубцами!) | |
| От: | MaximE![]() | ||
| Дата: | 22.09.03 10:03 | ||
| Оценка: | ![]() | ||
| Здравствуйте, Дмитрий Наумов, Вы писали: ДН>Здравствуйте, MaximE, Вы писали: ME>>Не знаю ME>>Меня без макросов вполне устраивает. ДН>Позвольте угадаю сей до боли знакомый (по себе самому) эффект — так понравилась статья, что до конца не дочитал — бросился использовать! Оригинальную статью я читал давно, и помнил, что там упоминались макросы, но до последнего времени я не использовал scope_guard вообще — не было необходимости. Понадобилось — я сразу подумал про boost::bind — всего делов-то засунуть вызов в деструктор. |
| 1 2 |