Здравствуйте, 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) "наслаиваются" и где-то происходит "преждевременная эвакуация" временных объектов.