我对Boost :: Phoenix很新,我用它在C ++中做FP。我在官方网页上浏览了教程。但是,我想知道为什么没有例子说明如何“保存”变量。例如,在值示例中,它表示使用函数变量
std::cout << val(3)() << std::endl;
直接打印出执行结果。如果我想保存变量怎么办?像
type t = val(3);
val(3)
的类型是什么?当我想声明一个惰性函数返回的函数变量的类型时,会发生同样的事情。它的类型是什么?我不明白为什么整个教程总是立即输出它。我使用它错了吗?
谢谢, 易
答案 0 :(得分:3)
您可以随时(解码)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
来实现相同的功能(现在{ {1}})。例如:
std::function
然后
auto f1 = boost::phoenix::val(3.);
std::function<double()> f2 = boost::phoenix::val(3.);
给出3。
f1()
也给出了3。
回答你的第二个问题,如果你需要在我看来以错误的方式知道你正在使用库的表达式的类型,因为这是一个实现细节(事实上它已经改变了不同版本的凤凰城。)