01 мая 2010

Comma operator returns

RAII в C++ - замечательная вещь. Количество кода сокращается на порядок (ну, если мыслить в двоичной системе исчисления, то в 2 раза - это на порядок, в 4 раза - уже на два порядка).

Например, следующий код дает нам возможность показать курсорчик "думаем..." и убрать его когда мы додумаем:
{
WTL::CWaitCursor WaitCursor;
SomeOperation();
}
Не нужно руками восстанавливать курсор ни в случае если операция завершится успешно, ни в случае если кинет исключение. Все сделает деструктор класса CWaitCursor.

Но вот такой случай заставляет нас вручную восстанавливать курсор:
{
WTL::CWaitCursor WaitCursor;
if (!SomeOperation())
{
WaitCursor.Restore();
MessageBox("не получилось :(");
}
}
Обидно, да? А не восстановим - получим MessageBox не с тем курсором.

Вот тут-то и приходит на помощь старый добрый оператор запятая. Трюк в чем: при вычислении выражения все его аргументы живут до конца вычисления всего выражения. Построим выражение, где у нас будет "думающий" курсор и наша операция:
if (WTL::CWaitCursor(), !SomeOperation())
MessageBox("не получилось :(");

6 комментариев:

iLych комментирует...

Забавно. А можно сделать декоратор, что выполняет заданную функу, включая на время выполнения курсор, при это все ещё возвращая её результат? Шаблоны с переменным числом аргументов(variadic templates) могут помочь. Кто знает?

Raider комментирует...

Можно, конечно

Константин Казимиров комментирует...

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

Sergey Kishchenko комментирует...
Этот комментарий был удален автором.
Sergey Kishchenko комментирует...

Прошу прощения за прошлый комментарий, на мгновение разум затуманился.

Alexander Korkov комментирует...

нужно было добавить замечание "так писать нельзя!"