Я начал играть с Boost::Range, чтобы иметь конвейер ленивых преобразований в C++. Теперь моя проблема заключается в том, как разделить конвейер на более мелкие части. Предположим, у меня есть:
int main(){
auto map = boost::adaptors::transformed; // shorten the name
auto sink = generate(1) | map([](int x){ return 2*x; })
| map([](int x){ return x+1; })
| map([](int x){ return 3*x; });
for(auto i : sink)
std::cout << i << "\n";
}
И я хочу заменить первые две карты на magic_transform
, то есть:
int main(){
auto map = boost::adaptors::transformed; // shorten the name
auto sink = generate(1) | magic_transform()
| map([](int x){ return 3*x; });
for(auto i : sink)
std::cout << i << "\n";
}
Как написать magic_transform
? Я посмотрел Boost ::Документация Range, но я не могу в ней разобраться.
Дополнение: я хочу написать такой класс:
class magic_transform {
... run_pipeline(... input) {
return input | map([](int x){ return 2*x; })
| map([](int x){ return x+1; });
};
generate
? Меня беспокоит, что вашsink
содержит ссылку на временное имя, срок действия которого заканчивается точкой с запятой. - person Mankarse   schedule 06.11.2012generate
–boost::iterator_range
. Подробнее см. liveworkspace.org/code/841508d3b54bed4181d4e9fb6058200f. - person bruno nery   schedule 06.11.2012