【发布时间】:2013-03-05 13:26:45
【问题描述】:
如何在 Boost Phoenix 表达式的转换中也包含函数体?
例如,我在Boost Phoenix Starter Kit的Lazy Functions部分构建,并创建了一个惰性添加函数:
struct my_lazy_add_impl {
typedef int result_type;
template <typename T>
T operator()(T x, T y) const { return x+y; }
};
phoenix::function<my_lazy_add_impl> my_add;
然后,我从previous question 准备一个简单的正负转换,如下所示:
struct invrt:
proto::or_<
proto::when<
proto::plus<proto::_, proto::_>,
proto::functional::make_expr<proto::tag::minus>(
invrt(proto::_left), invrt(proto::_right)
)
>,
proto::otherwise<
proto::nary_expr<proto::_, proto::vararg<invrt> >
>
>
{};
但是,当我将使用 my_add 的倒置 Phoenix lambda 表达式应用于其参数时,如下所示,似乎没有实现预期的倒置。有没有推荐的方法在 Phoenix 中实现函数调用,可以促进这种转换?
int main(int argc, char *argv[])
{
auto f = phoenix::lambda(_a = 0)[my_add(_1,_2)];
auto g = invrt()(phoenix::lambda(_a = 0)[my_add(_1,_2)]);
std::cout << f()(1,2) << std::endl; // 3
std::cout << g()(1,2) << std::endl; // 3 again; alas not -1
return 0;
}
【问题讨论】:
标签: c++ templates boost boost-phoenix boost-proto