int pipe1(int val) {
return 2*val;
}
int pipe2(int val) {
return val+1;
}
int sink(int val) {
return val*3;
}
for(int i=0; i < SOME_MAX; ++i)
{
cout << sink(pipe2(pipe1(i))) << endl;
}
我知道,这不是您所期望的,但它肯定会在您想要的时候进行评估,尽管不是使用迭代器 iterface。一篇非常相关的文章是这样的:
D 中的组件编程
12 年 11 月 6 日编辑:
仍然坚持裸 C++ 的另一种方法是使用函数指针并为上述函数构造自己的管道(来自 SO q 的函数指针向量:如何将函数指针存储在向量中?):
typedef std::vector<int (*)(int)> funcVec;
int runPipe(funcVec funcs, int sinkVal) {
int running = sinkVal;
for(funcVec::iterator it = funcs.begin(); it != funcs.end(); ++it) {
running = (*(*it))(running); // not sure of the braces and asterisks here
}
return running;
}
这旨在遍历此类向量中的所有函数并返回结果值。那么你也能:
funcVec funcs;
funcs.pushback(&pipe1);
funcs.pushback(&pipe2);
funcs.pushback(&sink);
for(int i=0; i < SOME_MAX; ++i)
{
cout << runPipe(funcs, i) << endl;
}
当然,您也可以通过结构为此构造一个包装器(如果 C++ 这样做,我会使用闭包......):
struct pipeWork {
funcVec funcs;
int run(int i);
};
int pipeWork::run(int i) {
//... guts as runPipe, or keep it separate and call:
return runPipe(funcs, i);
}
// later...
pipeWork kitchen;
kitchen.funcs = someFuncs;
int (*foo) = &kitchen.run();
cout << foo(5) << endl;
或类似的东西。警告:不知道如果指针在线程之间传递会发生什么。
额外警告:如果你想用不同的函数接口来做到这一点,你最终将不得不加载大量void *(void *)(void *)
函数,以便它们可以接受任何内容并发出任何内容,或者大量模板来修复你拥有的管道类型。我想理想情况下,你会为函数之间的不同接口构造不同类型的管道,这样a | b | c
即使它们在它们之间传递不同类型也可以工作。但我猜这很大程度上就是 Boost 正在做的事情。