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 中,您可以使用auto,但由于您只想知道它的功能方面,您几乎可以通过将表达式存储为boost::function(now std::function) 来实现相同的目的。例如:

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

然后

f1()

给出 3。

f2()

也给出 3。

回答你的第二个问题,如果你需要知道在我看来你以错误的方式使用库的表达式的类型,因为这是一个实现细节(实际上它在不同版本的 Phoenix 中发生了变化)。

于 2013-11-20T06:22:49.583 回答