auto plus_1 = phx::bind(&plus,1,arg1);
この行の後には、1 つの引数を取り、それに 1 を追加plus_1する関数オブジェクトがあります。int
phx::lambda[plus_1(arg1)](1);
おっと。(上で述べたように)は 1 つの引数を取り、それに 1 つ追加plus_1する関数オブジェクトであるため、これは機能しません。intここでは、 で呼び出そうとしていますarg1。
コードからは、何を期待しているのかは明らかではありません。明確にできますか?
====編集====
質問のコードを編集したようです。あなたのコードはまだ間違っていますが、別の理由があります。これ:
phx::val(plus_1)(arg1)
... を使用valして、単項関数を返す nullary 関数を作成しますplus_1。次に、nullary 関数を で呼び出そうとしarg1ます。ブーム。
これは、実行して実行するコードです(私が信じていることです)。
#include <iostream>
#include <boost/phoenix/phoenix.hpp>
namespace phx = boost::phoenix;
using phx::arg_names::arg1;
int plus(int a,int b)
{
return a+b;
}
int main()
{
auto plus_1 = phx::bind(&plus, 1, arg1);
int value = phx::bind(phx::lambda[plus_1], arg1)(1);
std::cout << value << std::endl;
}
1 つ目bindはバイナリplusを受け取り、最初の引数が にバインドされた単項関数に変換し1ます。2 番目は、最初の と同等bindの新しい単項関数を作成しますが、これは を使用して最初の関数を安全にラップすることによって行われます。なぜそれが必要なのですか?以下のコードを検討してください。これは同等ですが、 はありません。lambdalambda
// Oops, wrong:
int value = phx::bind(phx::bind(&plus, 1, arg1), arg1)(1);
arg1が 2 回表示されることに注意してください。すべての式は、裏返しに評価されます。まず、内部を にバインドしてarg1から、内部のyielding を1評価し、それをバインドして呼び出します。呼び出し可能ではないため、機能しません。bind22
を使用するとlambda、内部のスコープが作成されるため、arg1熱心に置換されることはありません。しかし、私が言ったように、bindの必要性を強制する2 番目の を使用lambdaすると、最初の と同等の関数が得られます。したがって、それは不必要に複雑です。bindしかし、 、lambdaおよび Phoenix スコープについて理解するのに役立つかもしれません。