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
の新しい単項関数を作成しますが、これは を使用して最初の関数を安全にラップすることによって行われます。なぜそれが必要なのですか?以下のコードを検討してください。これは同等ですが、 はありません。lambda
lambda
// Oops, wrong:
int value = phx::bind(phx::bind(&plus, 1, arg1), arg1)(1);
arg1
が 2 回表示されることに注意してください。すべての式は、裏返しに評価されます。まず、内部を にバインドしてarg1
から、内部のyielding を1
評価し、それをバインドして呼び出します。呼び出し可能ではないため、機能しません。bind
2
2
を使用するとlambda
、内部のスコープが作成されるため、arg1
熱心に置換されることはありません。しかし、私が言ったように、bind
の必要性を強制する2 番目の を使用lambda
すると、最初の と同等の関数が得られます。したがって、それは不必要に複雑です。bind
しかし、 、lambda
および Phoenix スコープについて理解するのに役立つかもしれません。