|
Boost Users : |
Subject: Re: [Boost-users] [Lambda] Lost in lambda land!
From: Michael Caisse (boost_at_[hidden])
Date: 2010-03-23 17:17:51
Robert Jones wrote:
> Hi Folks,
>
> Can anyone tell me why this is wrong? My intention is to call A::f()
> for each A constructed
> on-the-fly from the elements of v.
>
> Thanks, Rob.
>
Hi Rob -
Since I'm promoting phoenix these days (o;
Here is one way you could do it --------------------
#include <iostream>
#include <vector>
#include <boost/spirit/include/phoenix.hpp>
struct A
{
A( int i ) : i_( i ) {}
void f(){ std::cout << i_ << std::endl; }
int i_;
};
int main()
{
using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;
using namespace boost::phoenix::local_names;
std::vector< int > vec;
// fill the vector with something
for( int i=0; i < 10; ++i )
{
vec.push_back( i );
}
// create an A for each vector entry
std::for_each( vec.begin(), vec.end(),
let( _a = construct<A>(arg1) )
[
bind( &A::f, _a )
]
);
return 0;
}
------------------------------------------------
And now say we want to do something a little more interesting ... like
store the newly constructed object in a vector also.
#include <iostream>
#include <vector>
#include <boost/spirit/include/phoenix.hpp>
struct A
{
A( int i ) : i_( i ) {}
void f(){ std::cout << i_ << std::endl; }
int i_;
};
int main()
{
using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;
using namespace boost::phoenix::local_names;
std::vector< int > vec;
std::vector< A > a_vec;
// fill the vector with something
for( int i=0; i < 10; ++i )
{
vec.push_back( i );
}
// create an A for each vector entry, call f()
// on the object and store it in a vector
std::for_each( vec.begin(), vec.end(),
let( _a = construct<A>(arg1) )
[
bind( &A::f, _a ),
push_back( ref(a_vec), _a )
]
);
// print out our vector of A's using a phoenix bind
// to a member variable
std::for_each( a_vec.begin(), a_vec.end(),
( std::cout << bind( &A::i_, arg1) << " " ) );
return 0;
}
------------------------------------------------
Write the "push_back" for bind/lambda ... you will see why phoenix is so
much nicer to look at.
michael
-- ---------------------------------- Michael Caisse Object Modeling Designs www.objectmodelingdesigns.com
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net