|
2007/10/29(Mon) 22:29:11 編集(投稿者)
> 一般化すると > f(g(h(_1, _2, _3, …)))(x,y,z,…) > → > f(g(h(x, y, z,…))) って説明で、なんだか解ってきたかも!
じゃあ、 double Add(double,double); //足し算 double Mul(double,double); //掛け算 double Sub(double,double); //引き算 のとき、 Add(x, Mul(Sub(y, x), z)); は bind(Add, _1, bind(Mul, bind(Sub, _2, _1), _3))(x,y,z); と等価なのかなー、と思い立ち、実験してみました。 んで、結果、同じになりました。
function<double(double,double,double)> func = bind(Add, _1, bind(Mul, bind(Sub, _2, _1), _3)); double a = func(x,y,z); とするとき、_1はx、_2はy、_3はzなんですね。 _1や_2などプレースホルダは、いちばん内側のbind()に全部なければイカンっちゅうわけではないのですね。
ここにきて、やっと自分の「モヤモヤ感」が何なのか見えてきた感じがします。 というのは、率直に言えば、 function<double(double,double,double)> foo = bind(Add, _1, bind(Mul, bind(Sub, _2, _1)(b, a), _3)); double b = foo(x,y,z); なんてのはどうなのか、と。 bind(Sub, _2, _1)(b, a)の部分の_1と_2はxとyじゃなくてaとbなんですよね。 (果たして、このコードが有益になる場面があるのかは分かりませんが...) _1やら_2やらのスコープ(って言っていいのかな?)に関してずっとモヤモヤしてました。
んで、もっと推し進めて、 function<double(double,double,double)> bar = bind(Add, _1, bind(Mul, bind(Sub, _2, _1)(b, _1), _3)); double c = bar(x,y,z); はどうなんだ、と。 これはうまくいきませんでした。 bind(Sub, _2, _1)(b, _1) において、_1にはxが充てられるものと期待したのですが。
ともあれ、かなり頭の中がすっきりしました。 コメントをくださったmあ@反省中さん、囚人さん、ありがとうございました。
|