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