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