...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
template< typename Sequence , typename State , typename BackwardOp , typename ForwardOp = _1 > struct fold_backward { typedef unspecified type; };
Returns the result of the successive application of binary BackwardOp
to the result of the previous BackwardOp
invocation (State
if it's the first call) and every element in the range [begin<Sequence>::type,end<Sequence>::type)
in the reverse order. If ForwardOp
is provided, then it's applied on forward traversal to form the result which is passed to the first BackwardOp
call.
#include "boost/mpl/fold_backward.hpp"
Parameter | Requirement | Description | Default value |
---|---|---|---|
Sequence | A model of Sequence | A sequence to iterate. | |
State | A type | The initial state for the first BackwardOp /ForwardOp application. | |
BackwardOp | A model of [Lambda Function] | The operation to be executed on backward traversal. | |
ForwardOp | A model of [Lambda Function] | The operation to be executed on forward traversal. | arg<1> |
Expression | Expression type | Precondition | Semantics | Postcondition |
---|---|---|---|---|
typedef fold_backward< Sequence,T,BackwardOp >::type t; | A type | Equivalent to typedef lambda<BackwardOp>::type bk_op; typedef begin<Sequence>::type i1; typedef i1::next i2; ...; typedef in::next last; typedef apply<bk_op,T,in::type>::type tn; typedef apply<bk_op,tn,in-1::type>::type tn-1; ...; typedef apply<bk_op,t2,i1::type>::type t1; typedef t1 t , where n == size<Sequence>::type::value and last is identical to end<Sequence>::type ; Equivalent to typedef T t; if the sequence is empty. | ||
typedef fold_backward< Sequence,T,BackwardOp,ForwardOp >::type t; | A type | Equivalent to typedef fold_backward<Sequence, fold<Sequence,State,ForwardOp>::type, BackwardOp>::type t; . |
Linear. Exactly size<Sequence>::type::value
applications of BackwardOp
and ForwardOp
.
Removes negative elements from a sequence [1].
typedef list_c<int,5,-1,0,-7,-2,0,-5,4> numbers; typedef list_c<int,-1,-7,-2,-5> negatives; typedef fold_backward< numbers , list_c<int> , if_< less< _2,int_<0> >, push_front<_1,_2,>, _1 > >::type result;BOOST_STATIC_ASSERT(equal< negatives,result >::type::value);
[1] See remove_if
for a more compact way to do this.
Algorithms, fold
, iter_fold_backward
, iter_fold
, copy
, copy_backward