Boost C++ 库

...世界上最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

结构模板 reverse_fold_tree - Boost C++ 函数库
PrevUpHomeNext

结构模板 reverse_fold_tree

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 的表达式树展平为类似 Fusion 列表 cons(a, cons(b, cons(c)))

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).

它具有从后往前折叠树的效果,递归到与父节点共享标签类型的子节点。


PrevUpHomeNext