Re[2]: Алгоритмы возвращающие наборы, или...
От: Warturtle  
Дата: 19.06.18 12:30
Оценка:
Здравствуйте, ViTech, Вы писали:

VT>Здравствуйте, Мёртвый Даун, Вы писали:


МД>>Хочется функцию, которая будет обращаться к этому контейнеру, и на основании значений возвращаемых геттерами объектов класса B, чтото возвращала. Но что? Набор? Новый std::vector? Range?


VT>Думаю, нужно смотреть в сторону Range library. В частности, эта штука:

VT>
struct Selection {
VT>  Selection(std::vector<A*>&, std::function<bool(A*)> predicate);
VT>  std::vector<A*>::iterator begin() const;
VT>  std::vector<A*>::iterator end() const;
VT>}
очень похожа на ranges::view::filter. Стало быть, возвращать надо либо новый контейнер, либо ranges::view::xxxx.


1) Или не возвращать ничего, а передать доп параметр, который будет делать необходимое:
template< class RangeT >
void ProcessSelection(RangeT & rng, std::function< bool(typename RangeT::value_type)> pred, std::function< void(typename RangeT::value_type) > const & action)
{
    ...
    if (pred(a))
        action(a);
    ...
}


2) Еще можно написать кастомный итератор с помощью boost::iterator_facade — это, скорее всего, то же, что и ranges::v3::view::filter, только вид сбоку.

VT>Кстати, кто-нибудь плотно работал с ranges? Возвращать из функции какой-нибудь ranges::view::xxxx это хорошо или плохо ?


Это может не работать, если время жизни объектов, по которым итерируют итераторы (они ведь там внутри генерятся?), будет недостаточно длинным, например. Логично использовать полученный диапазон "на лету", а не хранить его где-то, а поэтому проблем быть не должно, за исключением случаев, когда диапазоны (какие-то их преобразования типа reversed_range) "наслаиваются" и где-то происходит "преждевременная эвакуация" временных объектов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.