2

Boost::Phoenix は初めてで、C++ で FP を実行するために使用しています。私は彼らの公式ページのチュートリアルを調べました。ただし、変数を「保存」する方法を示す例がないのはなぜだろうか。たとえば、値の例では、関数変数を使用するように指示されています

std::cout << val(3)() << std::endl;

実行結果を直接出力します。変数を保存したい場合はどうすればよいですか? お気に入り

type t = val(3);

の型はval(3)何ですか? 遅延関数によって返される関数変数の型を宣言したい場合も同じことが起こります。それの種類は何ですか?チュートリアル全体が常にすぐに出力される理由がわかりません。私はそれを間違って使用していますか?

ありがとう、イー

4

1 に答える 1

3

いつでも (demangle) typeid(...phoneix expression...).name()(またはコンパイラ エラーを作成) して、式の型を確認できます。すぐに、式を表す型 (場合によっては数十行になる) を知ることは意図されていない (そして実際的ではない) ことに気付くでしょう。

だからあなたの最初の質問に答えます:

typeid(boost::phoenix::val(3.) =
boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<double>, 0l> >

内部のすべてactorは、依存すべきではない実装の詳細です。

C++ 11では使用できますが、知りたいのは関数の側面だけなので、式を(now )autoとして格納することでほぼ同じことを実現できます。例えば:boost::functionstd::function

auto f1 = boost::phoenix::val(3.);
std::function<double()> f2 = boost::phoenix::val(3.);

それで

f1()

3 を与えます。

f2()

3 も与えます。

2 番目の質問に答えてください。式のタイプを知る必要がある場合、私の意見ではライブラリを間違った方法で使用しています。これは実装の詳細であるためです (実際には別のバージョンの Phoenix で変更されました)。

于 2013-11-20T06:22:49.583 に答える