Информация об изменениях

Сообщение 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, схематично:
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, схематично:
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 можно вернуть вверх по стэку.