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;
}
私は知っています、それはあなたが期待していたものではありませんが、イテレータの反復ではありませんが、あなたが望むときに確かに評価します。非常に関連する記事はこれです:
Dでのコンポーネントプログラミング
2012年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のものが行っていることだと推測します。