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("не получилось :(");

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

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

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

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

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

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

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

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

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

Блогер комментирует...

Если по-честному, за такой код надо руки отрывать. Он решает элементарнейшую задачу, но чтобы его расшифровать, надо напрячь мозг. Это пошлейшее нарушение KISS principle.

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

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