|
C#のコードを見ると、func0とfunc1の両方ともintを受け取ってintを返す関数なので、 C++の方も両方ともfunction<int(int)>でいいと思うんですよね。 どういう書き方すればコンパイル通るのか分からないんですが。
bind(func0, _1 * 2); って書いて、func0の引数に_1 * 2の結果(int)が渡されることを期待しているんですけど、 それが無理なんですかねー。 コンパイルエラーのメッセージを見ると、「演算子*は_1と2に適用できないYO!!」みたいなのがあったので、 2をかけるのがNGなんですかね。 実際、bind(func0, _1)だったらコンパイルできるし。
C++の次期標準では lambda::_1 + lambda::_2 が <> (int x, int y) -> int { return x + y; } って記述可能だそうですね。 このコードの戻り値が関数オブジェクトなら、もっと素直に(?) func0 = <>(int n)->int{return n;}; func1 = <>(int n)->int{return func0(n*2);}; とかできるんですかねー。 <>とか->とか使うのやめて欲しいですけど、でもboost::lambda使うよりかは直観的に分かりやすいと思います。
> bind も単にカリー化したいときに使うのであって 素人の僕の場合、カリー化というと複数引数のうち第1引数だけを固定して第2引数以降を受け取る関数を返す関数を作るイメージで、 例えば int hoge(int a, int b, int c); から bind(&hoge, 10, _1, _2); // カリー化 みたいな。 だけど、bindってもっと汎用的で、カリー化だけでなくて bind(&hoge, _3, _1, _2); // 引数の順番を入れ替える bind(&hoge, _1, _3, _1); // 複数回使う引数や使わない引数がある bind(&hoge, _1, 10, 20); // 束縛する引数を第1引数以外にしてみる とかもできるみたいですし、(こんな用法が必要に迫られることがあるのか知らないけど) あと、bindの引数にbindの結果を与えてやれば合成関数も作れるらしいですね。
|