2

ルール/パーサーが返した属性を使用しないフリー関数を呼び出すセマンティック アクションを宣言するにはどうすればよいですか?

たとえば、文字列を返すパーサーがあるとしますが、頻度と期間に 2 つの整数値を取り、文字列を気にしない Beep のような無関係な関数を呼び出したいとします。

実際に直接呼び出すことは可能ですか、それとも、文字列を消費して呼び出すプロキシ関数を常に作成する必要がありますか?この場合は、その本体で Beep を呼び出しますか?

編集:申し訳ありません。最初に、Hartmut が提案した構文で boost::phoenix::bind を使用したことを言及する必要がありました。これにより、次のエラーが発生しました。

could not deduce template argument for 'RT (__cdecl *)(T0,T1)' from 'BOOL (__stdcall *)(DWORD,DWORD)'

ここで物事を台無しにするのは呼び出し規約ですか?

Edit2: それが問題のようです。Hartmuts コードは、Beep と同じ量と型の引数を取る単純な関数でコンパイルされます。

example:
bool foo(DWORD a, DWORD b)
{
}

px::bind(&foo,123,456); //compiles
px::bind(&Beep,123,456); // doesn't compile and generates the error message above.

Google 検索の結果、(ほとんどの) WINAPI 関数は __stdcall 規則を使用していることがわかった。

したがって、これまでの回答はすべて正しかったため、フェニックスのソリューションはそのままでは機能しませんでした。(そもそもこの質問を投稿する動機になりました。威厳がなく混乱を招く性質で申し訳ありませんが、これですべてが解決するかもしれません。)

今私にとって不明な唯一のことは...フェニックスを__stdcallとうまくやっていく方法ですが、それはおそらく別の質問になるはずです。

4

2 に答える 2

1

BoostBindを使用できると思います。ラッパー関数を記述してそのアドレスをQiに与える代わりに、次のようにすることができます。

boost::bind( Beep, 123, 456 );

これにより、独自の引数を破棄してを呼び出すバインディングが構築されますBeep(123, 456)。その議論も伝えたい場合(ここでは、一般的なことを説明するためだけに行うのではなく)、次のようにすることができます。

boost::bind( Beep, 123, 456, _1 );

その後、それは呼び出しますBeep(123, 456, the_string)

于 2011-04-26T12:26:40.870 に答える