Boost C++ 库

...世界上最受尊敬且设计最精湛的C++库项目之一。 Herb SutterAndrei Alexandrescu, C++编码规范

结构体模板 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 的表达式树展平为类似 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).

它的作用是从后向前折叠一棵树,递归到与父节点共享标签类型的子节点中。


PrevUpHomeNext