Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Необязательно. Можно сделать обёртку, которая переместит вектор и адаптеры во внутрь себя, и при этом сама будет являться range, схематично:
| | code |
| | EP>EP>template< ..., typename LazyRange>
EP>class wrapper
EP>{
EP> vector<...> inner_vector;
EP> LazyRange lazy_range;
EP>public:
EP> ...
EP> auto begin() const ...;
EP> auto end() const ...;
EP>};
EP>
|
| | |
Вектор будет жить столько, сколько будет жить обёртка — её можно даже вернуть вверх по стэку.
EP>Если совсем не оптимально, то можно ещё вот так проиллюстрировать:
| | code |
| | EP>EP>auto shared_data = make_shared<vector<int>>( GetData() );
EP>auto doubled = *shared_data | boost::adaptors::transformed([shared_data](auto i){ return i * 2; });
EP>
|
| | |
doubled можно вернуть вверх по стэку.
Все так, но судя по всему (тут вангую) ТС именно этого и хотел избежать. Можно ж было просто
const std::vector<int>& data = GetData();
//тут строим нужный пайплайн из вьюшек
сделать. Вот жизнь исходного вектора и продлена.