Общий случай
Если я правильно его понял, он говорит, что вы можете исключить из своего кода почти все (все?) Рукописные циклы.
ХорошоДа и нет - очевидно, это зависит от того, какие петли вы пишете.Я полагаю, что он слегка преувеличил, чтобы подчеркнуть тот факт, что много циклов не являются действительно необходимыми, и, возможно, лучше реорганизовать их в применение стандартных "алгоритмов" библиотеки.
Кроме того, по существу, любой циклможет быть заменен на std::for_each
, но это на самом деле не считается, поскольку он скрывает только явное управление прогрессией цикла и все еще является «просто циклом».
Ваш конкретный пример
ВВ вашем случае итерация цикла работает, когда регистрирует / сообщает о каждой итерации выполняемой работы и готова принять запрос на прерывание.Вы могли бы написать вариант std::for_each
с этим дополнительным аспектом функциональности, затем использовать его для фактической работы в качестве особого случая, например,
namespace with_progress_dialog {
template< class InputIt, class UnaryFunction >
void for_each(
InputIt first,
InputIt last,
UnaryFunction function,
std::string_view message_prefix = "Processing item " )
{
ProgressDialog progress_dialog;
for (position_t position = 0; first != last; ++first, ++position)
{
progress_dialog.SetPosition(position);
progress_dialog.SetHeader(message_prefix + position);
function(*first);
if ( progress_dialog.IsCancelRequested() ) { break; }
}
}
}
, а затем вызвать
// ... etc. etc. ...
with_progress_dialog::for_each(
std::begin(v), std::end(v),
&DoSomethingThatTakesSomeTime);
* 1022.* Теперь, это, конечно, слишком обобщение.Но я предполагаю, что у вас есть другие случаи, когда вы открываете диалог прогресса, который постепенно обновляется.Так что, возможно, адаптируйте ваше обобщение соответствующим образом.Или - может быть, вы можете сохранить какое-то состояние на уровне окна, когда выполняете тяжелую работу, и сделать так, чтобы другой поток отслеживал это и открывал диалоговое окно, когда это необходимо, или отображал индикацию в строке состояния.Еще один вариант, возможно, запустить этот диалог в
co-rountine (но это довольно умозрительно, но я не уверен, что это хорошая идея).
Примечание: это не очень хорошоИдея, и потенциально небезопасная, просто продолжать и печатать строки, над которыми вы работаете, - которые, вероятно, могут возникать из входных данных, которые вы не контролируете.Вы должны удостовериться, что они не слишком длинные, и рассмотреть их дезинфекцию.В моем коде я печатаю только индекс («позиция»).