|
Boost : |
Subject: Re: [boost] [local] Help for the Alternatives section
From: Joel de Guzman (joel_at_[hidden])
Date: 2011-03-28 21:56:04
On 3/29/2011 12:37 AM, lcaminiti wrote:
>
> This worked :)) Finally Boost.Local's Phoenix example reads:
>
> #include<boost/spirit/include/phoenix.hpp>
> #include
> #include
> #include
>
> int main() {
> double sum = 0.0;
> int factor = 10;
>
> std::vector v(3);
> v[0] = 1.0; v[1] = 2.0; v[2] = 3.0;
>
> // Passed as template parameter and also defined at expression level.
> std::for_each(v.begin(), v.end(), boost::phoenix::let(
> // Bind `factor` by constant (reference).
> boost::phoenix::local_names::_f = boost::phoenix::cref(factor))[
> // Unfortunately, body cannot use C++ statement syntax.
> // Access `sum` by (non-constant) reference.
> boost::phoenix::ref(sum) += boost::phoenix::local_names::_f *
> boost::phoenix::arg_names::_1,
> std::cout<< boost::phoenix::val("Summed: ")<<
> boost::phoenix::ref(sum)<< "\n"
> ]);
>
> std::cout<< sum<< std::endl;
> return 0;
> }
>
> BTW, this is pretty powerful stuff ;)
I'd use using declarations to avoid code clutter and make the
code more readable.
int main() {
double sum = 0.0;
int factor = 10;
std::vector v(3);
v[0] = 1.0; v[1] = 2.0; v[2] = 3.0;
using boost::phoenix::let;
using boost::phoenix::local_names::_f;
using boost::phoenix::cref;
using boost::phoenix::ref;
using boost::phoenix::arg_names::_1;
using boost::phoenix::val;
// Passed as template parameter and also defined at expression level.
std::for_each(v.begin(), v.end(), let(
// Bind `factor` by constant (reference).
_f = cref(factor))[
// Unfortunately, body cannot use C++ statement syntax.
// Access `sum` by (non-constant) reference.
ref(sum) += _f * _1,
std::cout << val("Summed: ") << ref(sum) << "\n"
]);
std::cout << sum << std::endl;
return 0;
}
Regards,
-- Joel de Guzman http://www.boostpro.com http://boost-spirit.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk