Boost C++ 库

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

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

结构体模板 fold_tree

boost::proto::fold_tree — 一个 PrimitiveTransform,递归地将 proto::fold<> 转换应用于所有共享相同标签类型的子树。

提要

// In header: <boost/proto/transform/fold_tree.hpp>

template<typename Sequence, typename State0, typename Fun> 
struct fold_tree :  proto::transform< fold_tree<Sequence, State0, Fun> > {
  // member classes/structs/unions
  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>
  {
  };
};

描述

proto::fold_tree<> 对于将树展平为列表很有用;例如,您可以使用 proto::fold_tree<> 将像 a | b | c 这样的表达式树展平为像 cons(c, cons(b, cons(a))) 这样的 Fusion 列表。

proto::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::fold<proto::_, proto::_state, recurse_if_<Tag, Fun> >,
    // ... apply the Fun transform.
    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).

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


PrevUpHomeNext