Boost logo

Boost :

Subject: Re: [boost] [local] Help for the Alternatives section
From: Lorenzo Caminiti (lorcaminiti_at_[hidden])
Date: 2011-03-27 09:48:11


On Sat, Mar 26, 2011 at 8:05 PM, Michael Caisse
<boost_at_[hidden]> wrote:
> On 03/26/2011 04:46 PM, Steven Watanabe wrote:
>>
>> AMDG
>>
>> On 03/26/2011 04:27 PM, Michael Caisse wrote:
>>>
>>> #include <boost/phoenix/phoenix.hpp>
>>> #include <boost/phoenix/statement.hpp>
>>> #include <iostream>
>>> #include <vector>
>>> #include <algorithm>
>>>
>>> int main() {
>>>  double sum = 0.0;
>>>  int factor = 10;
>>>
>>>  using namespace boost::phoenix;
>>>  using namespace boost::phoenix::placeholders;
>>>
>>>  std::vector<double> v(3);
>>>  v[0] = 1.0; v[1] = 2.0; v[2] = 3.0;
>>>  std::for_each(v.begin(), v.end(), (
>>>    ref(sum) += factor * _1,
>>>    std::cout << "Summed: " << ref(sum) << "\n" )
>>>  );
>>>  return 0;
>>> }
>>>
>>
>> This is incorrect.  std::cout << "Summed: " is evaluated
>> eagerly.
>>
>> In Christ,
>> Steven Watanabe
>
> Sorry about that:
>
>    std::cout << val("Summed: ") << ref(sum) << "\n"
>
>
> or one of the other possibilities will do fine.

I tried this but it didn't work... why?

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    double sum = 0.0;
    int factor = 10;

    std::vector<double> v(3);
    v[0] = 1.0; v[1] = 2.0; v[2] = 3.0;

    std::for_each(v.begin(), v.end(), (
        boost::phoenix::ref(sum) += factor * boost::spirit::qi::_1,
        std::cout << boost::phoenix::val("Summed: ") <<
                boost::phoenix::ref(sum) << "\n"
    ));

    std::cout << sum << std::endl;
    return 0;
}

It prints:

Summed: 0
Summed: 0
Summed: 0
0

Instead of:

Summed: 10
Summed: 30
Summed: 60
60

-- 
Lorenzo

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk