您总是可以(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 中发生了变化)。