У меня есть контейнерный класс (содержащий мультииндексный контейнер), для которого у меня есть общественность "foreach" функция членства, таким образом, пользователи могут передать функтор для применения на все элементы.
При реализации у меня был случай, где функтор должен только быть применен к некоторым элементам диапазона в контейнере, таким образом, я перегрузил foreach, для передачи некоторого допустимого диапазона.
Теперь, в некоторых случаях, стоило остановиться на определенном условии, так практически, я позволяю foreach остановиться на основе возвращаемого значения функции.
Я доволен тем, как система работает, но у меня есть одно беспокойство:
Как должен "foreach" на диапазоне, с условиями остановки быть названным?
Кто-либо знает универсальное, ясное и краткое имя?
Исходя из вашего описания, я бы выбрал apply_until ()
.
Я бы назвал это либо foreach_until
, либо foreach_while
(пытаясь следовать соглашению, основанному на функциях _if
, таких как replace_if
и remove_if
, за исключением того, что условие здесь не "если" каждый из них истинен, а "пока" не выполнится конечное условие). Или просто foreach
. std::for_each
игнорирует возвращаемое значение функтора, но это не обязательно означает, что ваша функция, вызванная foreach
, должна это делать. Я думаю, что это довольно распространенная идиома для функции обратного вызова иметь возвращаемое значение, позволяющее досрочно выйти из управляющего цикла.
Если обратный вызов возвращает либо значение false (для продолжения), либо значение true (для остановки), то можно вызвать функцию find_if
. По сути, это то, что нужно, и это можно реализовать, используя std::find_if
, даже если вызывающего не интересует, какой итератор спровоцировал условие завершения.
родовое имя? ConditionalIterator? RangeIterator? Или, поскольку это функция, возможно, IterateRange?
Если вы можете предоставить функцию подмножества, которая возвращает представление интересующих элементов, возможно, вам не понадобится apply_until (). Просто myContainer.subset (3, 17) .foreach (myFunctor)
Я думаю, что это лучшее разделение проблем.