Например, следующий код дает нам возможность показать курсорчик "думаем..." и убрать его когда мы додумаем:
{Не нужно руками восстанавливать курсор ни в случае если операция завершится успешно, ни в случае если кинет исключение. Все сделает деструктор класса CWaitCursor.
WTL::CWaitCursor WaitCursor;
SomeOperation();
}
Но вот такой случай заставляет нас вручную восстанавливать курсор:
{Обидно, да? А не восстановим - получим MessageBox не с тем курсором.
WTL::CWaitCursor WaitCursor;
if (!SomeOperation())
{
WaitCursor.Restore();
MessageBox("не получилось :(");
}
}
Вот тут-то и приходит на помощь старый добрый оператор запятая. Трюк в чем: при вычислении выражения все его аргументы живут до конца вычисления всего выражения. Построим выражение, где у нас будет "думающий" курсор и наша операция:
if (WTL::CWaitCursor(), !SomeOperation())
MessageBox("не получилось :(");
6 комментариев:
Забавно. А можно сделать декоратор, что выполняет заданную функу, включая на время выполнения курсор, при это все ещё возвращая её результат? Шаблоны с переменным числом аргументов(variadic templates) могут помочь. Кто знает?
Можно, конечно
Интересное решение, даже красивое...
А вот через декоратор - это пмм уже слишком.
Только на хоть сколько бы сложной логике я бы вот именно такой вариант не применял.
Прошу прощения за прошлый комментарий, на мгновение разум затуманился.
нужно было добавить замечание "так писать нельзя!"
Отправить комментарий