boost::proto::reverse_fold_tree — 一个 PrimitiveTransform,它递归地将 proto::reverse_fold<>
转换应用于共享相同标签类型的所有子树。
// In header: <boost/proto/transform/fold_tree.hpp> template<typename Sequence, typename State0, typename Fun> struct reverse_fold_tree : proto::transform< reverse_fold_tree<Sequence, State0, Fun> > { // member classes/structs/unions template<typename Expr, typename State, typename Data> struct impl : proto::reverse_fold<Sequence, State0, recurse_if_<typename Expr::proto_tag, Fun> > ::template impl<Expr, State, Data> { }; };
proto::reverse_fold_tree<>
用于将树展平为列表;例如,您可以使用 proto::reverse_fold_tree<>
将类似 a | b | c
的表达式树展平为类似 cons(a, cons(b, cons(c)))
的 Fusion 列表。
proto::reverse_fold_tree<>
可以很容易地用 recurse_if_<>
辅助函数来理解,定义如下
template<typename Tag, typename Fun> struct recurse_if_ : proto::if_< // If the current node has type type "Tag" ... boost::is_same<proto::tag_of<proto::_>, Tag>(), // ... recurse, otherwise ... proto::reverse_fold<proto::_, proto::_state, recurse_if_<Tag, Fun> >, // ... apply the Fun transform. Fun > {};
使用如上定义的 recurse_if_<>
,proto::reverse_fold_tree<Sequence, State0, Fun>()(expr, state, data)
等价于
proto::reverse_fold< Sequence, State0, recurse_if_<typename Expr::proto_tag, Fun> >()(expr, state, data).
它的作用是从后向前折叠一棵树,递归到与父节点共享标签类型的子节点中。