Struct template reverse_fold_tree
boost::proto::reverse_fold_tree — A PrimitiveTransform that recursively applies the
proto::reverse_fold<>
transform to
sub-trees that all share a common tag type.
Synopsis
template<typename Sequence, typename State0, typename Fun>
struct reverse_fold_tree :
proto::transform< reverse_fold_tree<Sequence, State0, Fun> >
{
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>
{
};
};
Description
<proto::reverse_fold_tree<>
>полезно для сплющивания деревьев в списки; например, вы можете использовать<proto::reverse_fold_tree<>
>для сплющивания дерева выражения, такого как<a | b | c
>, в список слияния, такой как<cons(a, cons(b, cons(c)))
>.
<proto::reverse_fold_tree<>
>легко понять в терминах<recurse_if_<>
>помощника, определяемого следующим образом:
template<typename Tag, typename Fun>
struct recurse_if_ :
proto::if_<
boost::is_same<proto::tag_of<proto::_>, Tag>(),
proto::reverse_fold<proto::_, proto::_state, recurse_if_<Tag, Fun> >,
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).
Он имеет эффект складывания дерева спереди, повторяясь в детские узлы, которые разделяют тип тега с родительским узлом.