【发布时间】:2012-10-25 20:34:42
【问题描述】:
我开始使用 Boost::Range 以获得pipeline of lazy transforms in 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's documentation,但我不能很好地掌握它。
附录:我正在寻找这样的类:
class magic_transform {
... run_pipeline(... input) {
return input | map([](int x){ return 2*x; })
| map([](int x){ return x+1; });
};
【问题讨论】:
-
generate的返回类型是什么?我担心您的sink包含对在分号处到期的临时文件的引用。 -
generate的返回类型为boost::iterator_range,详情请查看liveworkspace.org/code/841508d3b54bed4181d4e9fb6058200f。 -
魔幻变换没有得到输入参数。你把它写成一个空函数。
-
好吧,它更像是一个类而不是一个函数。见上文。
-
你的需求还很模糊。是你想要的管道语法吗?围绕链式 lamdas 的变换提供了 | 的功能和外部使用。你真的想要|在你的 magic_transform 中,如果是,为什么?
标签: c++ boost functional-programming boost-range